Python 带列表的Numpy数组索引:arr[:][li]和arr[:,li]之间的差异
以下行为的解释是什么:Python 带列表的Numpy数组索引:arr[:][li]和arr[:,li]之间的差异,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,以下行为的解释是什么: import numpy as np arr = np.zeros((3, 3)) li = [1,2] print('output1:', arr[:, li].shape) print('output2:', arr[:][li].shape) >>output1: (3, 2) >>output2: (2, 3) 我希望output2等于output1。您得到的是正确的输出 在第一线 print('output1:', arr[:
import numpy as np
arr = np.zeros((3, 3))
li = [1,2]
print('output1:', arr[:, li].shape)
print('output2:', arr[:][li].shape)
>>output1: (3, 2)
>>output2: (2, 3)
我希望output2等于output1。您得到的是正确的输出 在第一线
print('output1:', arr[:, li].shape)
您正在打印arr中每个子阵列的第2个和第3个元素,因此得到3个元素,每个元素包含2个值
第二行
print('output2:', arr[:][li].shape)
首先选择整个数组,然后从整个数组中选择第二个和第三个元素,每个元素本身包含3个元素,从而得到2个元素,每个元素包含3个值。您得到的是正确的输出 在第一线
print('output1:', arr[:, li].shape)
您正在打印arr中每个子阵列的第2个和第3个元素,因此得到3个元素,每个元素包含2个值
第二行
print('output2:', arr[:][li].shape)
首先选择整个数组,然后从整个数组中选择第二个和第三个元素,每个元素本身包含3个元素,从而得到2个元素,每个元素包含3个值。如果检查此代码,可以看到差异-
import numpy as np
arr = np.arange(9).reshape(3, 3)
li = [1,2]
print('output1:', arr[:, li])
print('output2:', arr[:][li])
这给-
[[1 2]
[4 5]
[7 8]]
及
当您执行arr[:,[1,2]]时,您所说的是要获取数组的所有行:指定这个,并从中获取列[1,2]
另一方面,在执行arr[:]时,首先引用的是完整数组。您将再次从中取出前两行
本质上,在第二种情况下,[12]指的是原始数组的行轴,而在第一种情况下,它指的是列。如果检查此代码,可以看到差异-
import numpy as np
arr = np.arange(9).reshape(3, 3)
li = [1,2]
print('output1:', arr[:, li])
print('output2:', arr[:][li])
这给-
[[1 2]
[4 5]
[7 8]]
及
当您执行arr[:,[1,2]]时,您所说的是要获取数组的所有行:指定这个,并从中获取列[1,2]
另一方面,在执行arr[:]时,首先引用的是完整数组。您将再次从中取出前两行
本质上,在第二种情况下,[12]指的是原始数组的行轴,而在第一种情况下,它指的是列。让我们使用一个不同的数组,更容易看到差异:
>>> arr = np.arange(9).reshape(3, 3)
>>> arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
第一种情况下,arr[:,li]将从第一个维度中选择所有元素(本例中为所有行),然后使用[1,2]对数组进行索引,这意味着只需省略第一列:
数组[[1,2],
[4, 5],
[7, 8]]
因此,它的形状是3,2
另一种情况arr[:]将复制原始数组,因此它不会更改形状,因此它与arr[li]相等,因此输出形状为2,3。通常,您应该避免对数组进行双重索引,因为这样可能会创建两次视图,这是低效的。让我们使用一个不同的数组,以便更容易看到差异:
>>> arr = np.arange(9).reshape(3, 3)
>>> arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
第一种情况下,arr[:,li]将从第一个维度中选择所有元素(本例中为所有行),然后使用[1,2]对数组进行索引,这意味着只需省略第一列:
数组[[1,2],
[4, 5],
[7, 8]]
因此,它的形状是3,2
另一种情况arr[:]将复制原始数组,因此它不会更改形状,因此它与arr[li]相等,因此输出形状为2,3。通常,您应该避免对数组进行双重索引,因为这样可能会创建两次视图,这是低效的。a[:]只复制a.a[:]只复制a。