Since arr
is 2d, iteration gives you the rows, not the elements.
Make a sample array:
In [347]: arr=np.arange(16).reshape(4,4)-10
In [348]: arr
Out[348]:
array([[-10, -9, -8, -7],
[ -6, -5, -4, -3],
[ -2, -1, 0, 1],
[ 2, 3, 4, 5]])
Iterate with some prints:
In [350]: for i in arr:
print(i)
print(i<0)
print((i<0).any())
.....:
result:
[-10 -9 -8 -7]
[ True True True True]
True
[-6 -5 -4 -3]
[ True True True True]
True
[-2 -1 0 1]
[ True True False False]
True
[2 3 4 5]
[False False False False]
False
The ValueError
results when you try to use that boolean array np.array([True, True, False, False])
in an if
statement. Applying all
or any
to the array reduces it to one scalar True/False value, which works in the if
statement.
You can apply the negative
test to the whole array, and apply all/any
to rows (or columns) — without iteration:
In [351]: arr<0
Out[351]:
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, False, False],
[False, False, False, False]], dtype=bool)
In [352]: (arr<0).any(axis=1)
Out[352]: array([ True, True, True, False], dtype=bool)
In [353]: (arr<0).all(axis=1)
Out[353]: array([ True, True, False, False], dtype=bool)
to get the non-negative values in the array, you can use this boolean mask (or its negative):
In [354]: arr[arr>=0]
Out[354]: array([0, 1, 2, 3, 4, 5])
Because there are different numbers of valid values in each row it can’t give you a 2d array.
But you can go back to iteration to get a list of values for each row. Here I use a list comprehension to do the iteration.
In [355]: [a[a>=0] for a in arr]
Out[355]:
[array([], dtype=int32),
array([], dtype=int32),
array([0, 1]),
array([2, 3, 4, 5])]
Есть такое задание:
Запросить ввод k чисел. Вводить можно отрицательные, положительные
числа, ноль. Числа могут повторяться. Найти количество отрицательных
чисел среди вводимых. Вывести ответ с пояснением.
В программе используется оператор цикла for
, оператор проверки условия if
…
Вот код, до которого я дошел:
k = int(input('Введите любое число '))
a = 0
for k in range(k, 1):
if k < 0:
print(k)
Как это сделать правильно?
Jack_oS
12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков
задан 20 апр 2021 в 7:39
2
Вам для «найти количество отрицательных» нужен какой-то счетчик этих самых «отрицательных», negatives
в данном случае (или а
, как у вас), который при выполнении условия нужно увеличивать на 1, а после цикла — вывести его на печать:
k = int(input('Количество чисел: '))
negatives = 0
for _ in range(k):
num = int(input(f'Введите {_+1}-е число: '))
if num < 0:
negatives += 1
print(f'Вы ввели {negatives} отрицательных чисел')
ответ дан 20 апр 2021 в 7:45
Jack_oSJack_oS
12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков
1
Функциональным стилем в одну строку чисто по приколу:
print('Отрицательных чисел:', sum(map(lambda x: int(input('Введите число: ')) < 0, range(int(input('Введите количество чисел: '))))))
ответ дан 20 апр 2021 в 8:29
CrazyElfCrazyElf
65.4k5 золотых знаков19 серебряных знаков50 бронзовых знаков
a = 0
for i in range(int(input('Введите любое число: '))):
a += int(input()) < 0
print(a)
ответ дан 20 апр 2021 в 7:46
KuchizuKuchizu
1,1986 серебряных знаков13 бронзовых знаков
1
0 / 0 / 0 Регистрация: 09.02.2021 Сообщений: 48 |
|
1 |
|
Написать функцию определения, есть ли в одномерном массиве отрицательные числа15.04.2021, 13:42. Показов 1949. Ответов 3
Написать функцию определения, есть ли в одномерном массиве
0 |
GorodetskiyKP 137 / 95 / 48 Регистрация: 22.10.2012 Сообщений: 234 |
||||
15.04.2021, 13:59 |
2 |
|||
0 |
4607 / 2028 / 359 Регистрация: 17.03.2012 Сообщений: 10,086 Записей в блоге: 6 |
|
15.04.2021, 17:12 |
3 |
есть ли в одномерном массиве Вы уж опреределитесь, в одномерном или в матрице.
0 |
Dax Модератор 1353 / 650 / 207 Регистрация: 23.03.2014 Сообщений: 3,054 |
||||||||
15.04.2021, 20:06 |
4 |
|||||||
Сообщение было отмечено mik-a-el как решение РешениеВ массиве:
Добавлено через 19 минут
0 |
Пускай имеется такая задача: дан список с численными элементами. Требуется найти и вернуть первый отрицательный элемент. Казалось бы, должна быть какая-нибудь встроенная функция для этого, но нет. Придется писать ее самим. Решение в лоб:
items = [1, 3, 5, -17, 20, 3, -6] for x in items: if x < 0: print(x) break else: print('not found')
Такое решение работает, но выглядит скорее по-бейсиковски, нежели чем по-питоновски. Пытаясь проявить смекалку, некоторые извращаются и пишут так:
result = list(filter(lambda x: x < 0, items))[0] print(result)
По-моему, стало гораздо сложнее, хоть и в одну строку. А может лучше так:
result = [x for x in items if x < 0][0]
Что ж, теперь лаконичнее, но все равно не идеал. Какая самая большая ошибка здесь? Что в первом, что во втором случае идет перебор всего итератора до конца, а потом отбрасываются все лишние значения, кроме нулевого индекса. Тогда как изначальный код останавливается, найдя нужно значение, экономя и время, и память.
Правильное решение
Лучше использовать встроенную функцию next – она возвращает следующий элемент из итератора, а в качестве итератора мы напишем генераторное выражение с if. Вот так:
result = next(x for x in items if x < 0)
Вот это коротко, экономно и очень по-питоновски (in a pythonic way). Остается одна проблемка: если элемент не найден, что будет брошено исключение StopIteration. Чтобы подавить его, достаточно вторым аргументом в next передать значение по-умолчанию. Если оно задано, то оно будет возвращено вместо возбуждения исключения, если в итераторе нет элементов, то есть не найдено удовлетворяющих условию элементов в исходной коллекции. И не забыть обернуть генераторное выражение в скобки:
items = [1, 2, 4] result = next((x for x in items if x < 0), 'not found') print(result) # not found
С произвольной функцией, задающей критерий поиска (ее еще называют предикат – predicate) это выглядит так:
def is_odd(x): return x % 2 != 0 result = next(x for x in items if is_odd(x)) # или еще лучше result = next(filter(is_odd, items))
Так как в Python 3 filter работает лениво, как и генератор, она не «обналичивает» весь исходный список через фильтр, а лишь идет до первого удачно-выполненного условия. Любите итераторы! ✌️
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈
3 372
У меня есть пустой массив arr
с отрицательными double
элементами. Он имеет форму (1000,1000)
. Поскольку элементы являются сложными, мы используем arr.real
только для оценки действительной части.
Я сначала попробовал
for i in arr.real:
if i < 0:
print(i)
Это дало следующую ValueError:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
Однако, если я попытаюсь
for i in arr.real:
if i.any() < 0:
print(i)
Или
for i in arr.real:
if i.all() < 0:
print(i)
Нет выхода. Ничего не печатается, хотя отрицательные значения существуют.
Как мне исправить это? Что я недопонимаю?
РЕДАКТИРОВАТЬ:
for i in arr.real:
print(i[i<0])
Работает. Однако как искать два условия? Например,
i < 0 and i > -1e-12
3 ответа
Лучший ответ
Поскольку arr
является 2d, итерация дает вам строки, а не элементы.
Создайте массив образцов:
In [347]: arr=np.arange(16).reshape(4,4)-10
In [348]: arr
Out[348]:
array([[-10, -9, -8, -7],
[ -6, -5, -4, -3],
[ -2, -1, 0, 1],
[ 2, 3, 4, 5]])
Итерация с несколькими отпечатками:
In [350]: for i in arr:
print(i)
print(i<0)
print((i<0).any())
.....:
Результат:
[-10 -9 -8 -7]
[ True True True True]
True
[-6 -5 -4 -3]
[ True True True True]
True
[-2 -1 0 1]
[ True True False False]
True
[2 3 4 5]
[False False False False]
False
ValueError
возникает, когда вы пытаетесь использовать этот логический массив np.array([True, True, False, False])
в выражении if
. Применение all
или any
к массиву уменьшает его до одного скалярного значения True / False, которое работает в операторе if
.
Вы можете применить тест negative
ко всему массиву и применить all/any
к строкам (или столбцам) — без итерации:
In [351]: arr<0
Out[351]:
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, False, False],
[False, False, False, False]], dtype=bool)
In [352]: (arr<0).any(axis=1)
Out[352]: array([ True, True, True, False], dtype=bool)
In [353]: (arr<0).all(axis=1)
Out[353]: array([ True, True, False, False], dtype=bool)
Чтобы получить неотрицательные значения в массиве, вы можете использовать эту логическую маску (или ее отрицательную):
In [354]: arr[arr>=0]
Out[354]: array([0, 1, 2, 3, 4, 5])
Поскольку в каждой строке содержится разное количество допустимых значений, он не может дать вам двумерный массив.
Но вы можете вернуться к итерации, чтобы получить список значений для каждой строки. Здесь я использую понимание списка, чтобы сделать итерацию.
In [355]: [a[a>=0] for a in arr]
Out[355]:
[array([], dtype=int32),
array([], dtype=int32),
array([0, 1]),
array([2, 3, 4, 5])]
4
hpaulj
22 Янв 2016 в 20:58
Вы пробовали лямбда-выражения?
for k in arr:
print filter(lambda x: x < 0, k)
Если ваш «массив» — это словарь с ключами кортежей, вы можете использовать лямбда-код так:
d = {(0,0):-3,(0,1):3,(0,2):-3.7,(0,3):0,
(1,0):30,(1,1):-12,(1,2):-0.1,(1,3):2.5,}
keys = filter(lambda x: d[x] < 0, [k for k in d])
print [d[keys[n]] for n in range(0,len(keys))]
Возможно, чтобы ответить на ваш вопрос, это поможет,
import itertools as it
aK = it.product(range(0,len(arr)),range(0,len(arr)))
negKeys = filter(lambda x: arr[x[0]][x[1]] < 0, [k for k in ak])
negVals = [arr[k[0]][k[1]] for k in negKeys]
1
kpie
22 Янв 2016 в 20:52
Кажется, один из способов сделать это:
for row in arr.real:
for i in row:
if (i<0 and i<-1e-10):
print(i)
-2
ShanZhengYang
22 Янв 2016 в 20:44