在python中将2d数组读入3d数组

时间:2014-11-08 00:24:30

标签: python arrays matlab

我搜索了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数组?不确定。

谢谢!

2 个答案:

答案 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功能。