无法删除ndarray中的元素

时间:2019-11-09 18:26:27

标签: python numpy-ndarray

我正在尝试删除数组中的最后一个元素,如果该元素不符合某些条件。我正在使用的代码是:

# Set the distibution parameter to 2
a = 2

# Set the size to 100
s = 100

# Create Zipf's Law distribution using a and s
x = np.random.zipf(a,s)

# Reorder list by number frequency
xb = np.unique(x, return_counts=True)

print("X",x)
print("XB",xb)

for i in reversed(xb):
    if xb[-1] > xb[-2]*1.5:
        xb = np.delete(xb,-1)

print("XB mod",xb)
print()

我得到python print("X",x)和``python print(“ XB”,xb)的以下输出:

  

XB(array([1,2,3,4,5,6,7,8,9,9,10,11,28,   29,           31,33,56,225]),array([57,17,4,4,2,1,2,2,2,1,1,1,1,1,1,1,1],         dtype = int64))

但是,当我尝试运行代码的删除部分时,出现以下错误:

  

回溯(最近一次通话最后一次):文件“ test2.py”,第22行,在          如果xb [-1]> xb [-2] * 1.5:ValueError:包含多个元素的数组的真值不明确。使用a.any()或a.all()

有什么办法解决它,以便在不符合条件的情况下删除XB数组中的最后一个元素吗?

3 个答案:

答案 0 :(得分:2)

xb是一个由一对np.ndarray对象组成的元组。

  

如果不符合条件,如何删除XB数组中的最后一个元素

如果您要根据比较第一行数据的后两个数字(例如,数据的条件)删除最后一对压缩值(例如,数据的2251225 > 56 * 1.5作为您的数据):

if xb[0][-1] > xb[0][-2] * 1.5:
    xb = tuple(x[:-1] for x in xb)

>>> xb
(array([ 1,  2, ..., 31, 33, 56]), 
 array([57, 17, ...,  1,  1,  1]))

答案 1 :(得分:1)

简短答案:

使用all

for i in reversed(xb):
    if all(xb[-1] > xb[-2]*1.5): # use all here
        xb = np.delete(xb,-1)

等效:if (xb[-1] > xb[-2]*1.5).all():


长答案:

您有:

xb
(array([ 1,  2,  3,  4,  5,  7,  9, 10, 13, 21, 22, 24, 30]),
 array([62, 16,  2,  4,  6,  3,  1,  1,  1,  1,  1,  1,  1]))

那是numpy数组的列表。

接下来,xb[-1] > xb[-2]*1.5返回:

array([ True,  True, False, False, False, False, False, False, False,
   False, False, False, False])

如果您不使用allany,则这种情况会引起错误

答案 2 :(得分:-2)

问题出在if xb[-1] > xb[-2]*1.5

xb不是标量,而是向量(一维数组)。

那么v1> v2是什么意思?所有项目?至少一项?

以[2,3]> [1,4]为例,全部将返回False,因为3> 4是False,另一方面,任何,将返回True,因为至少有一个为true(2> 1)。

就像错误一样,指出它含糊

因此,例如,如果您希望所有项目都通过条件,则必须使用:

if np.all(xb[-1] > xb[-2]*1.5): ...