Python 如何使用嵌套索引为数组元素指定新值?
我希望最后的结果是[3,3,3]。为什么使用双索引替换元素不起作用?有没有一种方法可以使用双索引更改数组的元素 InPython 如何使用嵌套索引为数组元素指定新值?,python,numpy,Python,Numpy,我希望最后的结果是[3,3,3]。为什么使用双索引替换元素不起作用?有没有一种方法可以使用双索引更改数组的元素 In import numpy as np data = np.zeros((5,3)) In [44]: data Out[44]: array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) In [45]: da
import numpy as np
data = np.zeros((5,3))
In [44]: data
Out[44]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
In [45]: data[[0,1,2]] = 2
In [46]: data
Out[46]:
array([[ 2., 2., 2.],
[ 2., 2., 2.],
[ 2., 2., 2.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
In [47]: data[[0,1,2]][2]
Out[47]: array([ 2., 2., 2.])
In [48]: data[[0,1,2]][2] = 3
In [49]: data[[0,1,2]][2]
Out[49]: array([ 2., 2., 2.])
数据[[0,1,2]
是数据
的一部分的副本,而不是视图
。表达式正在修改该副本,而不是数据本身
data[[0,1,2]][2] = 3
这项任务是:
In [298]: data=np.arange(15).reshape(5,3)
In [299]: data[[0,1,2]]
Out[299]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [300]: data[[0,1,2]][2]
Out[300]: array([6, 7, 8])
因为“高级索引”就在=
之前。在第一种情况下,它由另一层索引分隔。In
import numpy as np
data = np.zeros((5,3))
In [44]: data
Out[44]:
array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
In [45]: data[[0,1,2]] = 2
In [46]: data
Out[46]:
array([[ 2., 2., 2.],
[ 2., 2., 2.],
[ 2., 2., 2.],
[ 0., 0., 0.],
[ 0., 0., 0.]])
In [47]: data[[0,1,2]][2]
Out[47]: array([ 2., 2., 2.])
In [48]: data[[0,1,2]][2] = 3
In [49]: data[[0,1,2]][2]
Out[49]: array([ 2., 2., 2.])
数据[[0,1,2]
是数据
的一部分的副本,而不是视图
。表达式正在修改该副本,而不是数据本身
data[[0,1,2]][2] = 3
这项任务是:
In [298]: data=np.arange(15).reshape(5,3)
In [299]: data[[0,1,2]]
Out[299]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
In [300]: data[[0,1,2]][2]
Out[300]: array([6, 7, 8])
因为“高级索引”就在
=
之前。在第一种情况下,它由另一层索引分隔。Python计算数据[i][j]=x的方法是首先计算tmp=data。
然后调用tmp.\uu setitem\uuuu(j,x)
。在numpy的例子中,当您使用列表对数组进行索引来计算数据[[1,2,3]]
时,您正在创建一个新数组,其中包含这些位置的数据副本。我们无法在数据上创建视图,因为列表可能有分散的索引,甚至是重复的索引。因此tmp
对象未连接到原始数据
对象。赋值tmp[2]=3
发生,但随后tmp
被丢弃。Python计算data[i][j]=x
的方法是首先计算tmp=data。
getitem\uuuuuuuuu(i)
然后调用tmp.\uuu setitem\uuuuuuuj(x)
。在numpy的例子中,当您使用列表对数组进行索引来计算数据[[1,2,3]]
时,您正在创建一个新数组,其中包含这些位置的数据副本。我们无法在数据上创建视图,因为列表可能有分散的索引,甚至是重复的索引。因此tmp
对象未连接到原始数据
对象。赋值tmp[2]=3
发生了,但是tmp
被扔掉了。这很奇怪。它必须与numpy.array的结构相关。根据我使用numpy的经验,数组切片是使用数据[outerindex,innerindex]而不是传统的Python列表数据[outerindex][innerindex]完成的
如果你这样做
data[[0,1,2]] = 2
您可以按预期修改数据:
data[[0,1,2],2] = 3
这很奇怪。它必须与numpy.array的结构相关。根据我使用numpy的经验,数组切片是使用数据[outerindex,innerindex]而不是传统的Python列表数据[outerindex][innerindex]完成的
如果你这样做
data[[0,1,2]] = 2
您可以按预期修改数据:
data[[0,1,2],2] = 3
为什么不数据[2]=3
?这只是一个简单的例子。我的实际数据是(50000,3),我需要用一个条件切片,然后用另一个条件切片,然后用一个值替换元素。也许可以使用逻辑运算符将两个条件组合在一起,然后进行赋值。为什么不data[2]=3
?这只是一个简单的示例。我的实际数据是(50000,3),我需要用一个条件切片,然后用另一个条件再次切片,然后用一个值替换元素。也许可以使用逻辑运算符将两个条件组合在一起,然后执行赋值。