我想更改numpy数组中的值,下面是我尝试过的内容:
import numpy as np
sdd_type = np.dtype(
{'names':['name','age','sex'],'formats':['S32','i','S32']})
sdd = np.array(
[('zhang',35,'M'),('song',34,'F'),('li',45,'M')], dtype=sdd_type
)
print sdd[sdd['name'] == 'song']['age']
#output:array([34])
print sdd[sdd['name'] == 'song']['age'][0]
#output:34
sdd[sdd['name'] == 'song']['age'][0] = 41
print sdd[sdd['name'] == 'song']['age']
#output:array([34]), but expect to be 41如何将值更改为41?
发布于 2015-05-18 02:16:32
正如在布尔或“掩码”索引数组中所解释的
与索引数组一样,返回的是数据的副本,而不是切片获得的视图。
正如在为索引数组赋值中所解释的,当您直接分配给索引时:
与某些引用(如数组和掩码索引)不同,分配总是要对数组中的原始数据进行分配(实际上,没有任何其他的东西是有意义的!)
但你不能在这里这么做。当您可以分配给sdd[sdd['name'] == 'song']和修改原始数组时,分配给sdd[sdd['name'] == 'song']['age']是在修改副本。
要理解为什么,您必须了解索引在Python中是如何工作的:像spam[eggs][beans][toast] = value这样的目标调用spam.__getitem__(eggs).__getitem__(beans).__setitem__(toast, value);NumPy不可能知道sdd[sdd['name'] == 'song']部件被用来分配什么而不是访问它。
文档解释了NumPy如何在简单的情况下处理这个问题:
…从包含1、1、3、1的值的原始数组(作为临时数组)中提取一个新数组,然后将值1添加到临时数组,然后将临时数组分配回原始数组。
因此,如果有多个[…]索引,则必须手动执行相同的操作:
tmp = sdd[sdd['name'] == 'song']
tmp[0]['age'] = 41
sdd[sdd['name'] == 'song'] = tmp请注意,如果您想立即更新所有命名为song的人,而不是仅仅更新第一个(希望只更新?)名为song的人,您只需删除[0],相同的代码就可以工作了。
但是,如果确实只有一个song,并且只想更新他,那么可以在xnx的回答中使用where-based解决方案,它有效地将包含掩码索引数组在内的多个索引转换为一个简单的索引。
发布于 2015-05-18 02:16:58
@abarnert解释了这种行为的原因,但您也可以这样做,以索引到原始数组中,而不是复制:
sdd[np.where(sdd['name']=='song')[0][0]]['age']=41https://stackoverflow.com/questions/30294042
复制相似问题