我正在尝试删除数组中的最后一个元素,如果该元素不符合某些条件。我正在使用的代码是:
# 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数组中的最后一个元素吗?
答案 0 :(得分:2)
xb
是一个由一对np.ndarray
对象组成的元组。
如果不符合条件,如何删除XB数组中的最后一个元素
如果您要根据比较第一行数据的后两个数字(例如,数据的条件)删除最后一对压缩值(例如,数据的225
和1
) 225 > 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])
如果您不使用all
或any
,则这种情况会引起错误
答案 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): ...