Python 获取一个3D或4D数组作为输入,并在来自外部脚本的函数中将其重塑为2D数组
好的,我的问题比将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前端(数据):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作为输入 有人能帮我写一个函数吗
- 检查data.shape
- 使用len(数据)命令获取x、y、z、t值
- 将数据重塑为([x*y*z,t])
- 返回经过整形的数据
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)