numpy如何用arrayl

时间:2016-04-28 18:34:53

标签: python numpy

说我有array1,它等于

array1=np.zeros((3,3))
that means [[0 0 0]
            [0 0 0]
            [0 0 0]]

但如果我尝试以下操作就会输出错误:

array2=np.array[[111,222,333],[444,555,666],[77
array1[1,1]=array2

那么我如何替换每个array1元素用于不同的新数组? 例如

for i in range(3):
   for j in range (3):
       if i-j==0:
         array1[i,j]=array2

所以它会变成3 * 9而不是3 * 3?

edit1 :上述示例的预期输出

  [[[251, 123, 584],
    [251, 123, 584],
    [251, 123, 584]],

   [[251, 123, 584],
    [251, 123, 584],
    [251, 123, 584]],

   [[251, 123, 584],
    [251, 123, 584],
    [251, 123, 584]]]

3 个答案:

答案 0 :(得分:1)

如果你可以使用列表而不是numpy数组,你可以这样做:

array1 = [[0,0],[0,0]]
array2 = [[1,2],[3,4]]

for i in range(len(array1)):
    for j in range(len(array1[0])):
        array1[i][j] = array2

print array1

Try it online

如果必须使用numpy数组,可以将它们转换为列表,然后在执行上述操作后将它们转换回numpy数组。

答案 1 :(得分:1)

您无法更改numpy数组的大小(元素数)。但您可以使用列表作为创建最终数组的中间步骤:

>>> import numpy as np
>>> array1 = np.zeros((3,3))
>>> array2 = [251,123,584]
>>> np.array([[array2 for _ in row] for row in array1.tolist()])
array([[[251, 123, 584],
        [251, 123, 584],
        [251, 123, 584]],

       [[251, 123, 584],
        [251, 123, 584],
        [251, 123, 584]],

       [[251, 123, 584],
        [251, 123, 584],
        [251, 123, 584]]])

采取一些中间步骤:

# Convert the original array to a list
>>> array1.tolist()
[[1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [1.0, 2.0, 3.0]]

# Iterate over all elements and replace the element by array2:
>>> [[array2 for _ in row] for row in array1.tolist()]
[[[251, 123, 584], [251, 123, 584], [251, 123, 584]],
 [[251, 123, 584], [251, 123, 584], [251, 123, 584]],
 [[251, 123, 584], [251, 123, 584], [251, 123, 584]]]

# Convert the list to a numpy array again
>>> np.array([[array2 for _ in row] for row in array1.tolist()])
...

答案 2 :(得分:1)

如果从足够大的数组开始,则可以插入较小的数组。广播将采取复制以匹配目标数组。

您的预期结果是3d,而不是(9,9):

In [118]: a=np.zeros((3,3,3),int)

In [119]: a2=np.array([251,123,584])

In [120]: a[...]=a2    # short hand for a[:,:,:]

In [121]: a
Out[121]: 
array([[[251, 123, 584],
        [251, 123, 584],
        [251, 123, 584]],

       [[251, 123, 584],
        [251, 123, 584],
        [251, 123, 584]],

       [[251, 123, 584],
        [251, 123, 584],
        [251, 123, 584]]])

此处a[...]=a2a[:,:,:]=a2[None,None,:]

的简写

使用a2[None,:,None]a2[:,None,None]会复制不同维度的a2值。

np.tile(a2,[3,3,1])也有效。 np.resize(a2,(3,3,3))也是如此。将这些概括起来可能比较棘手。

如果使尺寸不同,测试可以更清晰:

In [139]: a2=np.array([1,2,3,4])

In [140]: a[...]=a2

In [141]: a
Out[141]: 
array([[[ 1.,  2.,  3.,  4.],
        [ 1.,  2.,  3.,  4.],
        [ 1.,  2.,  3.,  4.]],

       [[ 1.,  2.,  3.,  4.],
        [ 1.,  2.,  3.,  4.],
        [ 1.,  2.,  3.,  4.]]])

此处只有4个元素a2符合最后一个维度。