Cannot assign values to a #39;double slice#39; using numpy(不能使用NumPy为双切片赋值)
本文介绍了不能使用NumPy为双切片赋值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何在NumPy中执行以下操作?
- 选择包含50%0以上值的数组的所有行。
- 从满足1的所有行中选择第一个
n
(假设为2)行。 - 做些什么,并将修改后的行放在形状相同的零数组的相同索引上。
以下结果会产生一个数组,其中不会分配新值:
In [177]:
a = np.array([[0,0,3],[4,5,6],[7,0,0],[10,11,12],[13,14,15]])
b = np.zeros_like(a)
a
Out[177]:
array([[ 0, 0, 3],
[ 4, 5, 6],
[ 7, 0, 0],
[10, 11, 12],
[13, 14, 15]])
In [178]:
# select all rows containg note more than 50% 0 values
percent = np.sum(a == 0, axis=-1) / float(check.shape[1])
percent = percent >= 0.5
slice = np.invert(percent).nonzero()[0]
In [183]:
# select first two rows satisfying 'slice'
a[slice][0:2]
Out[183]:
array([[ 4, 5, 6],
[10, 11, 12]])
In [182]:
# do something and place modified rows on same index of zero array
b[slice][0:2] = a[slice][0:2] * 2
In [184]:
b
Out[184]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
推荐答案
问题是b[slice]
创建的是副本而不是视图(它会触发花哨的索引)。代码b[slice][0:2]
创建此副本的视图(不是原始b
!)。因此..。
b[slice][0:2] = a[slice][0:2] * 2
...正在将a
的相应行分配给b
的副本的视图。
因为它可能导致这些情况,所以最好不要以这种方式链接索引操作。相反,只需先计算slice
的相关行数,然后执行赋值:
slice = np.invert(percent).nonzero()[0][:2] # first two rows
b[slice] = a[slice] * 2
这篇关于不能使用NumPy为双切片赋值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:不能使用NumPy为双切片赋值


基础教程推荐
猜你喜欢
- 使用 Google App Engine (Python) 将文件上传到 Google Cloud Storage 2022-01-01
- 使 Python 脚本在 Windows 上运行而不指定“.py";延期 2022-01-01
- 如何在 Python 中检测文件是否为二进制(非文本)文 2022-01-01
- 如何在Python中绘制多元函数? 2022-01-01
- 哪些 Python 包提供独立的事件系统? 2022-01-01
- Python 的 List 是如何实现的? 2022-01-01
- 合并具有多索引的两个数据帧 2022-01-01
- 将 YAML 文件转换为 python dict 2022-01-01
- 使用Python匹配Stata加权xtil命令的确定方法? 2022-01-01
- 症状类型错误:无法确定关系的真值 2022-01-01