首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python numpy更改数组值

python numpy更改数组值
EN

Stack Overflow用户
提问于 2015-05-18 01:53:44
回答 2查看 1.5K关注 0票数 2

我想更改numpy数组中的值,下面是我尝试过的内容:

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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添加到临时数组,然后将临时数组分配回原始数组。

因此,如果有多个[…]索引,则必须手动执行相同的操作:

代码语言:javascript
复制
tmp = sdd[sdd['name'] == 'song']
tmp[0]['age'] = 41
sdd[sdd['name'] == 'song'] = tmp

请注意,如果您想立即更新所有命名为song的人,而不是仅仅更新第一个(希望只更新?)名为song的人,您只需删除[0],相同的代码就可以工作了。

但是,如果确实只有一个song,并且只想更新他,那么可以在xnx的回答中使用where-based解决方案,它有效地将包含掩码索引数组在内的多个索引转换为一个简单的索引。

票数 1
EN

Stack Overflow用户

发布于 2015-05-18 02:16:58

@abarnert解释了这种行为的原因,但您也可以这样做,以索引到原始数组中,而不是复制:

代码语言:javascript
复制
sdd[np.where(sdd['name']=='song')[0][0]]['age']=41
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30294042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档