以最 pythonic 的方式写入 ndarray 的子 ndarray。 Python 2
Writting in sub-ndarray of a ndarray in the most pythonian way. Python 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]]).
非常感谢!
对于连续的行和列的情况,您可以像这样使用基本切片:
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]])
使用像 [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]])
对列表进行相同的索引需要 'broadcast' 相互对立的数组。 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]]))
我有一个像这样的 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]]).
非常感谢!
对于连续的行和列的情况,您可以像这样使用基本切片:
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]])
使用像 [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]])
对列表进行相同的索引需要 'broadcast' 相互对立的数组。 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]]))