我搜索了stackoverflow但找不到这个特定问题的答案。对不起,如果这是一个天真的问题,我是python的新手。
我有几个2d数组(或列表),我想在python中读入3d数组(列表)。在Matlab中,我可以简单地做到
for i=1:N
# read 2d array "a"
newarray(:,:,i)=a(:,:)
end
所以newarray是一个带有" a"的3d数组。是沿着第三维排列的第二片。
在python中有一种简单的方法吗?
编辑:我目前正在尝试以下方法:
for file in files:
img=mpimg.imread(file)
newarray=np.array(0.289*cropimg[:,:,0]+0.5870*cropimg[:,:,1]+0.1140*cropimg[:,:,2])
i=i+1
我尝试了newarray[:,:,i]
并且它给了我一个错误
NameError: name 'newarray' is not defined
好像我必须将newarray定义为numpy数组?不确定。
谢谢!
答案 0 :(得分:1)
如果您熟悉MATLAB,将其转换为使用NumPy非常简单。
假设你有几个阵列
a = np.eye(3)
b = np.arange(9).reshape((3, 3))
print(a)
# [[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]
print(b)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]
如果您只是想将它们放入另一个维度,请将它们传递给迭代(例如列表)中的数组构造函数,如下所示:
x = np.array([a, b])
print(x)
# [[[ 1. 0. 0.]
# [ 0. 1. 0.]
# [ 0. 0. 1.]]
#
# [[ 0. 1. 2.]
# [ 3. 4. 5.]
# [ 6. 7. 8.]]]
Numpy非常聪明,可以识别出阵列大小相同,并创建了一个新的维度来保存它们。
print(x.shape)
# (2, 3, 3)
你可以遍历它,但是如果你想在某些维度上对它应用相同的操作,我会强烈建议你使用广播以便NumPy可以对操作进行矢量化并且它运行一个整体很快。
例如,在一个维度上,让我们将一个切片乘以2,将另一个切片乘以3.(如果它不是纯标量,我们需要将数组重塑为相同数量的维度进行广播,然后根据每个需要调整大小匹配数组或1)。 请注意,我正在沿着第0轴工作,您的图像可能不同。我没有方便的图像来装载玩具
y = x * np.array([2, 3]).reshape((2, 1, 1))
print(y)
#[[[ 2. 0. 0.]
# [ 0. 2. 0.]
# [ 0. 0. 2.]]
#
# [[ 0. 3. 6.]
# [ 9. 12. 15.]
# [ 18. 21. 24.]]]
然后我们可以添加它们
z = np.sum(y, axis=0)
print(z)
#[[ 2. 3. 6.]
# [ 9. 14. 15.]
# [ 18. 21. 26.]]
答案 1 :(得分:0)
如果您正在使用NumPy数组,则几乎可以直接从Matlab进行翻译:
for i in range(1, N+1):
# read 2d array "a"
newarray[:, :, i] = a[:, :]
当然,您可能希望使用range(N)
,因为数组使用基于0的索引。显然,您需要以某种方式预先创建newarray
,就像您在Matlab中必须这样,但您也可以直接翻译它。 (如果您不确定如何,请查看zeros
功能。)
如果您正在使用列表,则无法直接执行此操作 - 但您可能无论如何也不想这样做。更好的解决方案是动态建立2D列表列表:
newarray = []
for i in range(N):
# read 2d list of lists "a"
newarray.append(a)
或者更简单:
newarray = [read_next_2d_list_of_lists() for i in range(N)]
或者,更好的是,让read
函数成为生成器,然后只需:
newarray = list(read_next_2d_list_of_lists())
如果您想转置轴的顺序,可以使用zip
功能。