不能使用NumPy为双切片赋值

Cannot assign values to a #39;double slice#39; using numpy(不能使用NumPy为双切片赋值)
本文介绍了不能使用NumPy为双切片赋值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在NumPy中执行以下操作?

  1. 选择包含50%0以上值的数组的所有行。
  2. 从满足1的所有行中选择第一个n(假设为2)行。
  3. 做些什么,并将修改后的行放在形状相同的零数组的相同索引上。

以下结果会产生一个数组,其中不会分配新值:

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为双切片赋值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Leetcode 234: Palindrome LinkedList(Leetcode 234:回文链接列表)
How do I read an Excel file directly from Dropbox#39;s API using pandas.read_excel()?(如何使用PANDAS.READ_EXCEL()直接从Dropbox的API读取Excel文件?)
subprocess.Popen tries to write to nonexistent pipe(子进程。打开尝试写入不存在的管道)
I want to realize Popen-code from Windows to Linux:(我想实现从Windows到Linux的POpen-code:)
Reading stdout from a subprocess in real time(实时读取子进程中的标准输出)
How to call type safely on a random file in Python?(如何在Python中安全地调用随机文件上的类型?)