Не могу удалить элемент в ndarray - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь удалить последний элемент в массиве, если элемент не удовлетворяет определенным условиям. Я использую следующий код:

# 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 ("XB", xb):

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

Однако, когда я пытаюсь запуститьПри удалении части кода я получаю следующую ошибку:

Traceback (последний вызов был последним): файл "test2.py", строка 22, если if xb [-1]> xb [-2] * 1.5: ValueError: Значение истинности массива с более чем одним элементом является неоднозначным. Используйте a.any () или a.all ()

Есть идеи, как это исправить, чтобы я мог удалить последний элемент в массиве XB, если он не удовлетворяет условию?

Ответы [ 3 ]

2 голосов
/ 09 ноября 2019

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 голос
/ 09 ноября 2019

Краткий ответ:

Использование 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():


Longответ:

У вас есть:

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]))

, который представляет собой список пустых массивов.

Далее, xb[-1] > xb[-2]*1.5 возвращает:

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

Если вы не используете all ИЛИ any, это условие вызовет ошибку

0 голосов
/ 09 ноября 2019

проблема в if xb[-1] > xb[-2]*1.5

xb - не скаляр, а вектор (массив 1d).

Так что же значит v1> v2? все элементы? хотя бы один элемент?

Например, [2,3]> [1,4], all вернет значение False, поскольку 3> 4 - значение False, any с другой стороны, вернет True, потому что есть хотя бы один, который является истинным (2> 1).

Как и ошибка, говорят, что это неоднозначно .

Так, если, например, вы хотите, чтобы все элементы прошли условие, которое вы должны использовать:

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