numpy删除不删除元素

时间:2016-08-25 23:58:27

标签: python arrays numpy

在什么情况下bumpy.delete只返回原始数组的副本,不加改变?

如果我按如下方式做一个简单的例子,那么事情就像宣传的那样:

>>> a = numpy.arange(0, 10)
>>> numpy.delete(a, [1])
>>> array([0, 2, 3, 4, 5, 6, 7, 8, 9])

但是当我使用numpy.array()从列表创建的数组时,事情就不再适用了。

    scale = [Params.BADVALUE, Params.BADVALUE+1]
    for h in xrange(500, 3001, 500):
        scale.append(h)
    scale += [4000, 5000]
    for h in xrange(7000, 17001, 2000):
        scale.append(h)
    scale.append(upper_bound)
    self.SCALE = numpy.array(scale)
    self.SCALE_WRITE = numpy.delete(self.SCALE, [1000.0])

self.SCALE_WRITE最终与self.SCALE相同

我已经检查过self.SCALE确实是1维的,并且没有错误添加额外的尺寸。

这很容易编码我的方式,但我仍然想知道我做错了什么。

凯瑟琳

2 个答案:

答案 0 :(得分:2)

对我而言,您似乎只是想删除一个不在数组中的索引;因此缺乏变化...... 从您的代码len(scale)只提供17。

对于doc指示的记录,numpy.delete(arr,obj)将尝试删除arr [obj] 为1-D数组返回的元素,以便:

  • numpy.delete(ARR,0)
  • numpy.delete(ARR,[0])
  • numpy.delete(ARR,0.0)
  • numpy.delete(ARR,[0.0])

删除{1}},这是该1-D数组的第0个元素

答案 1 :(得分:0)

首先,delete无法正常运作:

In [849]: a=np.arange(10)
In [850]: np.delete(a,[1])
Out[850]: array([0, 2, 3, 4, 5, 6, 7, 8, 9])  # returned array
In [851]: a
Out[851]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])  # not change in a

如果我用标量执行越界删除,我会收到错误:

In [853]: a1=np.delete(a,11)
...
IndexError: index 11 is out of bounds for axis 0 with size 10

但是如果删除是一个列表,则看起来边界检查不起作用(是否有参数?)

In [854]: a1=np.delete(a,[11])
In [855]: a1
Out[855]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

a1虽然是副本;更改其中一个值不会影响a

In [858]: a1[-1]=100
In [859]: a1
Out[859]: array([  0,   1,   2,   3,   4,   5,   6,   7,   8, 100])
In [860]: a
Out[860]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

np.delete是一个复杂的Python函数,编写得非常通用。它可以研究。它不是一项基本功能。对于基本的数组操作,如屏蔽,索引和/或选择性复制,它没有做任何事情。而且它不会更快。

=====

您可以学习np.delete。我的记忆是它经常做以下事情:

delete通过标量掩码:

In [863]: mask=np.ones(a.shape,dtype=bool)
In [864]: mask[1]=False
In [865]: a[mask]
Out[865]: array([0, 2, 3, 4, 5, 6, 7, 8, 9])

列表:

In [866]: mask=np.ones(a.shape,dtype=bool)
In [867]: mask[[1,3,5]]=False
In [868]: a[mask]
Out[868]: array([0, 2, 4, 6, 7, 8, 9])

==================

使用添加的显示重新创建脚本:

In [874]: scale=[1,2]
In [875]: for h in range(500,3001,500):scale.append(h)
In [876]: len(scale)
Out[876]: 8
In [877]: scale+=[4000,5000]
In [878]: for h in range(7000,17001,2000):scale.append(h)
In [879]: len(scale)
Out[879]: 16
In [880]: scale.append(1000)
In [881]: Scale=np.array(scale)
In [882]: Scale.shape
Out[882]: (17,)
In [883]: np.delete(Scale,[1000])
Out[883]: 
array([    1,     2,   500,  1000,  1500,  2000,  2500,  3000,  4000,
        5000,  7000,  9000, 11000, 13000, 15000, 17000,  1000])

所以数组中只有17个项目,而不是1000个。正如我用删除列表所示,如果它超出范围,它不会引发错误。因此delete结果是输入的副本。

顺便说一句,我使用数组连接创建相同的数组

In [886]: np.r_[1, 2, 500:3001:500, [4000,5000], 7000:17001:2000, 1000]
Out[886]: 
array([    1,     2,   500,  1000,  1500,  2000,  2500,  3000,  4000,
        5000,  7000,  9000, 11000, 13000, 15000, 17000,  1000])

即使坚持使用列表,我也可以使用extend来避免循环:

In [887]: scale=[1,2]
In [888]: scale.extend(range(500,3001,500))
In [889]: scale.extend([4000,5000])
In [890]: scale.extend(range(7000,17001,2000))
In [891]: scale.append(1000)