以最蟒蛇的方式在ndarray的子 阵列中写作。 Python 2

问题描述 投票:1回答:2

我有一个像这样的ndarray:

number_of_rows = 3
number_of_columns = 3
a = np.arange(number_of_rows*number_of_columns).reshape(number_of_rows,number_of_columns)
a

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

但是我想要这样的东西:

array([[0, 100, 101],
       [3, 102, 103],
       [6, 7, 8]])

要做到这一点,我想避免一个接一个地做,我更喜欢在数组或矩阵中做,因为后来我想扩展代码。 Nothe我已经改变了初始矩阵的子矩阵(在数学术语中,就这个例子而言是ndarray)。在示例中,所考虑的列是[1,2]和行[0,1]。

columns_to_keep = [1,2] 
rows_to_keep = [0,1]

我的第一次尝试是:

a[rows_to_keep,:][:,columns_to_keep] = np.asarray([[100,101],[102,103]])

但是这不会修改初始a,我没有任何错误,所以a =

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

所以我已经实现了一段可以完成工作的代码:

b = [[100, 101],[102, 103]]

for i in range(len(rows_to_keep)):
    a[i,columns_to_keep] = b[i]

Al认为以前的工作线做的工作我想知道如何以更快的方式切片。还有一种方式:

columns_to_keep = [0,2] 
rows_to_keep = [0,2]

期望的输出是

array([[100, 1, 101],
       [3, 4, 5],
       [102, 7, 103]]).

非常感谢!

python-2.7 numpy multidimensional-array slice numpy-ndarray
2个回答
1
投票

使用像[1,2]这样的列表进行索引称为高级索引。它本身产生一个副本,而不是一个视图。您必须使用一个索引表达式,而不是两个来分配或更改值。那是a[[1,2],:]是一个副本,a[[1,2],:][:,[1,2]] += 100修改该副本,而不是原来的a

In [68]: arr = np.arange(12).reshape(3,4)

用切片索引;这是基本的索引:

In [69]: arr[1:,2:]
Out[69]: 
array([[ 6,  7],
       [10, 11]])

In [70]: arr[1:,2:] += 100

In [71]: arr
Out[71]: 
array([[  0,   1,   2,   3],
       [  4,   5, 106, 107],
       [  8,   9, 110, 111]])

对列表执行相同的索引需要相互“广播”的数组。 ix_是一种方便的方式来产生这些:

In [73]: arr[np.ix_([1,2],[2,3])]
Out[73]: 
array([[106, 107],
       [110, 111]])

In [74]: arr[np.ix_([1,2],[2,3])] -= 100

In [75]: arr
Out[75]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

这是ix_产生的 - 一个数组元组,一个是(2,1)形状,另一个是(1,2)。他们一起索引(2,2)块:

In [76]: np.ix_([1,2],[2,3])
Out[76]: 
(array([[1],
        [2]]), array([[2, 3]]))

0
投票

对于连续的行和列情况,您可以使用如下基本切片:

In [634]: a
Out[634]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [635]: b = np.asarray([[100, 101],[102, 103]])

In [636]: a[:rows_to_keep[1]+1, columns_to_keep[0]:] = b

In [637]: a
Out[637]: 
array([[  0, 100, 101],
       [  3, 102, 103],
       [  6,   7,   8]])

© www.soinside.com 2019 - 2024. All rights reserved.