【问题标题】:Assigning values to a numpy array to zeros array将值分配给 numpy 数组到 zeros 数组
【发布时间】:2020-09-01 11:18:42
【问题描述】:

我一直在尝试将一个数组中的值分配给另一个数组,特别是从一个有值的数组到一个 zeros 数组。这些值在 zeros 数组中的位置也非常重要。这也是更大代码的一小部分,更大的图景是能够将 excel 电子表格中的值导入零矩阵。这是我的问题:

import numpy as np
x = np.zeros((2,3))
P= np.asarray ([1,2,3,4,5,6])
for i in range(0,2):
for j in range(0,3):
    x[i,j] = P[(i-1)*3+j] # 3 is the counter in x direction, nx
x

使用此代码,输出是(这是我想要的):

array([[4., 5., 6.],
       [1., 2., 3.]])

但是,如果我尝试扩展数组,如下所示:

import numpy as np
x = np.zeros((3,3))
P= np.asarray ([1,2,3,4,5,6,7,8,9])
for i in range(0,3):
for j in range(0,3):
    x[i,j] = P[(i-1)*3+j] # 3 is the counter in x direction, nx
x

输出是:

array([[7., 8., 9.],
       [1., 2., 3.],
       [4., 5., 6.]])

我希望输出是:

array([[7., 8., 9.],
       [4., 5., 6.],
       [1., 2., 3.]])

输出随着数组的扩展而变化的原因是什么?

【问题讨论】:

    标签: python arrays numpy assign


    【解决方案1】:

    你不需要迭代:

    In [323]: P=np.arange(1,10).reshape(3,3)[::-1,:]                                                       
    In [324]: P                                                                                            
    Out[324]: 
    array([[7, 8, 9],
           [4, 5, 6],
           [1, 2, 3]])
    

    至于你的循环,看看 i,j 的:

    In [325]: for i in range(3): 
         ...:     for j in range(3): 
         ...:         print(i,j,(i-1)*3+j) 
         ...:                                                                                              
    0 0 -3
    0 1 -2
    0 2 -1
    1 0 0
    1 1 1
    1 2 2
    2 0 3
    2 1 4
    2 2 5
    

    【讨论】:

    • 这是一个更大的代码的一小部分。代码的主要本质是将 Excel 工作表中的值分配给零矩阵,该矩阵可能采用多个不同维度的形式。
    • 无论如何,您的计算在某些情况下会产生负值。在从末尾开始索引的 Python 中。因此,如果您必须进行迭代,请确保索引是正确的。如果 P 是 2d,则您不必进行 (i-1)*3+j 计算;您可以使用ij 进行索引。
    【解决方案2】:

    你不需要使用循环,只需使用flip()和reshape()即可。

    import numpy as np
    
    m = 3 # number of rows you want
    
    n = 3 # number of column you want
    
    P = np.asarray ([1,2,3,4,5,6,7,8,9])
    
    P = np.flip(P.reshape(m,n), axis=0)
    
    print(P)
    
    [[7 8 9]
     [4 5 6]
     [1 2 3]]
    

    如果你想将它分配给一个零矩阵,你可以遍历索引。

    例如,假设您有一个更大的零矩阵,您想用当前生成的矩阵填充行 x、y、z。

    zero = np.zeros((10, 3))
    
    print(zero.shape)
    
    zero[[2, 5, 7], : ] = P # randomly assigning P to index 2, 5, 7th row of zero matrix
    
    print(zero)
    
    (10, 3)
    [[0. 0. 0.]
     [0. 0. 0.]
     [7. 8. 9.]
     [0. 0. 0.]
     [0. 0. 0.]
     [4. 5. 6.]
     [0. 0. 0.]
     [1. 2. 3.]
     [0. 0. 0.]
     [0. 0. 0.]]
    

    也可以循环遍历:

    for i in range(3):
        zero[i,:] = P[i,:] 
    

    【讨论】:

    • 这是一个更大的代码的一小部分。代码的主要本质是将值分配给一个零矩阵,该矩阵可能采用多个不同维度的形式。
    • 更新,可以将生成的矩阵赋给零矩阵。
    • 这可以工作,虽然可以像计数器一样逐行进行,而不是手动分配行。谢谢
    • 是的,代替 [2, 5, 7],你可以做类似 ``` for i in range(3): zero[i,:] = P[i,:] ` `` 通常,循环速度较慢,因此我没有显示。
    • 这真的很有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多