我有一条类似于此的警钟:
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]])为了做到这一点,我希望避免一个接一个地这样做,我更喜欢在数组或矩阵中这样做,因为稍后我想扩展代码。不,我改变了初始矩阵的子矩阵(用数学术语,在这个例子中)。在示例中,考虑的列是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]艾尔认为前几行都能做到这一点,我想知道如何以更快的方式进行切片。也是以这样的方式:
columns_to_keep = [0,2]
rows_to_keep = [0,2]所需的输出是
array([[100, 1, 101],
[3, 4, 5],
[102, 7, 103]]).非常感谢!
发布于 2018-01-26 18:30:00
使用像[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)。它们一起索引a (2,2)块:
In [76]: np.ix_([1,2],[2,3])
Out[76]:
(array([[1],
[2]]), array([[2, 3]]))发布于 2018-01-26 15:42:05
对于连续行和列的情况,可以使用以下基本切片:
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]])https://stackoverflow.com/questions/48464015
复制相似问题