首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在给定每一行一维索引的2d numpy数组中设置值?

如何在给定每一行一维索引的2d numpy数组中设置值?
EN

Stack Overflow用户
提问于 2022-05-22 20:39:58
回答 3查看 142关注 0票数 1

在numpy中,可以将一维数组的索引设置为值。

代码语言:javascript
运行
复制
import numpy as np 

b = np.array([0, 0, 0, 0, 0])

indices = [1, 3]

b[indices] = 1
b
代码语言:javascript
运行
复制
array([0, 1, 0, 1, 0])

我试图用多行和每一行的索引来实现这一点,以尽可能优雅的编程和高效的计算方式。例如

代码语言:javascript
运行
复制
b = np.array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])

indices = [[1, 3], [0, 1], [0, 3]]

期望的结果是

代码语言:javascript
运行
复制
array([[0, 1, 0, 1, 0],
       [1, 1, 0, 0, 0],
       [1, 0, 0, 1, 0]])

我尝试了b[indices]b[:,indices],但是它们导致了一个错误或不希望的结果。

从搜索的角度看,有几个工作环境,但在python中,每个循环都需要至少一个循环。

解决方案1:通过2d数组的每一行运行一个循环。这样做的好处是循环在python中运行,这个部分不会利用numpy的c++处理。

解决方案2:使用numpy put。退一步是put在输入数组的扁平版本上工作,因此索引也需要扁平,并根据行大小和行数进行更改,这将在python中使用双for循环。

解决方案3:put_along_axis似乎只能设置每行一个值,所以我需要对每一行的值数重复这个函数。

什么是计算上和编程上最优雅的解决方案?numpy能处理所有操作的地方吗?

EN

Stack Overflow用户

回答已采纳

发布于 2022-05-22 21:59:33

In 330: B= np.zeros((3,5),int)

要设置(3,2)列,行索引必须是(3,1)形状(通过广播进行匹配):

代码语言:javascript
运行
复制
In [331]: indices = np.array([[1,3],[0,1],[0,3]])

In [332]: b[np.arange(3)[:,None], indices] = 1

In [333]: b
Out[333]: 
array([[0, 1, 0, 1, 0],
       [1, 1, 0, 0, 0],
       [1, 0, 0, 1, 0]])

put along也做了同样的事情:

代码语言:javascript
运行
复制
In [335]: b = np.zeros((3,5),int)
In [337]: np.put_along_axis(b, indices,1,axis=1)

In [338]: b
Out[338]: 
array([[0, 1, 0, 1, 0],
       [1, 1, 0, 0, 0],
       [1, 0, 0, 1, 0]])
票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72341143

复制
相关文章

相似问题

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