python - Numpy:这段代码彼此有何不同?
问题描述
让r
是一个数组,其中每个元素都是一个列索引(小于N
,大小r
是M
)并且P
是一个M
xN
数组。
以下两个片段的行为不同。为什么?
1.
P[:, r] += 1
2.
for i in range(len(r)):
P[i, r[i]] += 1
解决方案
第一个为 的每个元素选择一整列r
。第二个只是一个元素。您可以像这样直接比较这两种情况:
>>> P = np.arange(12).reshape(4, 3)
>>> r = np.random.randint(0, 3, (4,))
>>> r
array([1, 1, 2, 0])
>>>
>>> P[:, r]
array([[ 1, 1, 2, 0],
[ 4, 4, 5, 3],
[ 7, 7, 8, 6],
[10, 10, 11, 9]])
>>> P[np.arange(4), r]
array([1, 4, 8, 9])
正如你所看到的,第二个基本上产生了第一个的对角线。
您可能会从numpy docs中的“结合高级和基本索引”部分中受益。
推荐阅读
- .net - 通过 IP 正确连接外部数据库的字符串
- java - php或节点加密功能的Java模拟
- c# - c# System.ComponentModel.Win32Exception: '指定的可执行文件不是此操作系统平台的有效应用程序
- javascript - 将 document.createElement('div') 更改为 document.createDocumentFragment()
- flutter - Flutter 移动应用程序中的 Usigng 字母 N'ko 字符
- cookies - 使用 cookie 进行本地主机开发
- mongodb - 如何从同一数据库的两个集合中查找元素并在猫鼬中删除它
- oracle - Oracle 12.2:优化器在末尾添加 FOR UPDATE OF ... 块时更改 SELECT 查询的解释计划
- pom.xml - 从多模块项目中的主 pom.xml 继承依赖项
- reactjs - .Map 后反应数据