Python 获取一个3D或4D数组作为输入,并在来自外部脚本的函数中将其重塑为2D数组

Python 获取一个3D或4D数组作为输入,并在来自外部脚本的函数中将其重塑为2D数组,python,python-2.7,multidimensional-array,user-defined-functions,reshape,Python,Python 2.7,Multidimensional Array,User Defined Functions,Reshape,好的,我的问题比将3D或4D阵列重塑为2D阵列要具体一点 我正在为3D或4D阵列的前端处理编写脚本 我想从外部脚本调用一个函数,该脚本将提供一个3D数组作为唯一的输入。所需的输出应为2D阵列 更详细地说,3D或4D阵列将是维度(x,y,t)或(x,y,z,t),其中x,y和z是空间维度,t是时间。基本上,这就是包含非恒定流数据的方式 现在我想把它重塑成一个具有形状([x*y*z,t])的二维数组。但是,这应该只使用多维数组作为输入来完成。我不想传递x,y,z和t作为输入 有人能帮我写一个函数吗

好的,我的问题比将3D或4D阵列重塑为2D阵列要具体一点

我正在为3D或4D阵列的前端处理编写脚本

我想从外部脚本调用一个函数,该脚本将提供一个3D数组作为唯一的输入。所需的输出应为2D阵列

更详细地说,3D或4D阵列将是维度(x,y,t)或(x,y,z,t),其中x,y和z是空间维度,t是时间。基本上,这就是包含非恒定流数据的方式

现在我想把它重塑成一个具有形状([x*y*z,t])的二维数组。但是,这应该只使用多维数组作为输入来完成。我不想传递x,y,z和t作为输入

有人能帮我写一个函数吗

大概

def前端(数据):

  • 检查data.shape
  • 使用len(数据)命令获取x、y、z、t值
  • 将数据重塑为([x*y*z,t])
  • 返回经过整形的数据
更新:我很抱歉没有说清楚。我的问题是关于形状。例如,我在x方向上有100个步骤,在y方向上有50个步骤,在z方向上有10个步骤,在时间方向上有20个步骤。即数组具有维度([100,50,10,20])。现在,我需要将这个([100,50,10,20])数组重塑为([50000,20])数组。这可以通过正常的“重塑”命令完成。现在的问题是,我只从外部脚本向函数中提供数据数组,我不知道它的维度。我需要找到数组的X维、Y维、Z维和t维,然后我需要将这个4D数组重塑为一个具有维度([X*Y*Z,t])的二维数组。最后,我必须将此2D数组作为输出。

更新: 问题的更新建议函数
frontend()
应该只接受一个数组(python列表)。这将是该情况下的简化解决方案:

def frontend(data):
  return [reduce(lambda a, b: a*b, data[:-1]), data[-1]]
返回列表的第一个元素是通过将
数据中的所有元素相乘生成的,最后一个元素除外(
数据[:-1]
)。这将是
[x,y]
[x,y,z]
。返回列表的第二个元素只是
数据的最后一个元素(
数据[-1]
)。在3D和4D情况下,这将是
t

用法示例:

>>> frontend([100,50,10,20])
[50000, 20]
>>> frontend([100,50,20])
[5000, 20]
Python 3的更新: 在Python3中,不再有
reduce()
函数。如果不导入任何内容,则需要使用循环:

def frontend(data):
  product = 1
  for elem in data[:-1]:
    product = product * elem
  return [product, data[-1]]
用法同上:

>>> frontend([100,50,10,20])
[50000, 20]
元组列表的以前解决方案: 我不完全确定你说的“检查数据.形状”是什么意思。我把它解释为测试一个元素有多少维度。我正在展示两个版本。第一种方法是检查第一个数据元素中的值的数量,第二种方法是简单地将一个数据元素(最后一个除外)的所有值相乘,然后将最后一个值作为结果“2D”元素的第二个值相加:

输出:

frontend():
5D:  []
4D:  [[6, 4], [210, 8]]
3D:  [[2, 3], [20, 6]]
2D:  []

frontendx():
5D:  [[24, 5], [1680, 9]]
4D:  [[6, 4], [210, 8]]
3D:  [[2, 3], [20, 6]]
2D:  [[1, 2], [2, 5]]
?D:  [[6, 5], [8, 9]]

谢谢你的解决方案,帕斯卡松香。它运行得很好

此外,我还提出了另一个解决方案

因为我在处理4D/3D/2D数组,所以我在外部脚本上编写了一个函数,导入它,然后在主脚本上使用它

我使用ndarray.ndim来查找维度并适当地重塑它

# Passing data as input
def frontend(data):
    if data.ndim == 4:
        data = data.reshape([data.shape[0]*data.shape[1]*data.shape[2],data.shape[3]])
        return data
    elif data.ndim == 3:
        data = data.reshape([data.shape[0]*data.shape[1],data.shape[2]])
        return data
    elif data.ndim == 2:
        return data
    else:
        text = 'unrecognized shape'
        print str(text)

这也非常有效

即使有了更新,我的回答也会有所帮助。但如果数据只是一个“数组”(一个包含树或四个元素的python列表),我还添加了一个简化的解决方案。
# Passing data as input
def frontend(data):
    if data.ndim == 4:
        data = data.reshape([data.shape[0]*data.shape[1]*data.shape[2],data.shape[3]])
        return data
    elif data.ndim == 3:
        data = data.reshape([data.shape[0]*data.shape[1],data.shape[2]])
        return data
    elif data.ndim == 2:
        return data
    else:
        text = 'unrecognized shape'
        print str(text)