Python 如何使用嵌套索引为数组元素指定新值?

Python 如何使用嵌套索引为数组元素指定新值?,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

我希望最后的结果是[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]: 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),我需要用一个条件切片,然后用另一个条件再次切片,然后用一个值替换元素。也许可以使用逻辑运算符将两个条件组合在一起,然后执行赋值。