Как найти отрицательные элементы массива питон

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's user avatar

Jack_oS

12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков

задан 20 апр 2021 в 7:39

WaP1's user avatar

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_oS's user avatar

Jack_oSJack_oS

12.5k7 золотых знаков18 серебряных знаков48 бронзовых знаков

1

Функциональным стилем в одну строку чисто по приколу:

print('Отрицательных чисел:', sum(map(lambda x: int(input('Введите число: ')) < 0, range(int(input('Введите количество чисел: '))))))

ответ дан 20 апр 2021 в 8:29

CrazyElf's user avatar

CrazyElfCrazyElf

65.4k5 золотых знаков19 серебряных знаков50 бронзовых знаков

a = 0
for i in range(int(input('Введите любое число: '))):
    a += int(input()) < 0
print(a)

ответ дан 20 апр 2021 в 7:46

Kuchizu's user avatar

KuchizuKuchizu

1,1986 серебряных знаков13 бронзовых знаков

1

0 / 0 / 0

Регистрация: 09.02.2021

Сообщений: 48

1

Написать функцию определения, есть ли в одномерном массиве отрицательные числа

15.04.2021, 13:42. Показов 1949. Ответов 3


Студворк — интернет-сервис помощи студентам

Написать функцию определения, есть ли в одномерном массиве
отрицательные числа. В матрице A(n,m) найти отрицательные элементы,
лежащие ниже главной диагонали.
НА ПИТОНЕ
помогите . буду благодарен
спасибо.



0



GorodetskiyKP

137 / 95 / 48

Регистрация: 22.10.2012

Сообщений: 234

15.04.2021, 13:59

2

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import random
from pprint import pprint
 
 
n = 5
m = 5
A = [[random.randint(-100, 100) for _ in range(m)] for _ in range(n)]
 
negative = []
for row_num, row in enumerate(A):
    for col_num, item in enumerate(row):
        if col_num < row_num and item < 0:
            negative.append(item)
 
pprint(A)
print(len(negative))



0



Эксперт Python

4607 / 2028 / 359

Регистрация: 17.03.2012

Сообщений: 10,086

Записей в блоге: 6

15.04.2021, 17:12

3

Цитата
Сообщение от KNOps
Посмотреть сообщение

есть ли в одномерном массиве
… В матрице A(n,m)

Вы уж опреределитесь, в одномерном или в матрице.



0



Dax

Модератор

Эксперт Python

1353 / 650 / 207

Регистрация: 23.03.2014

Сообщений: 3,054

15.04.2021, 20:06

4

Лучший ответ Сообщение было отмечено mik-a-el как решение

Решение

В массиве:

Python
1
2
3
4
5
6
7
8
9
10
11
import random
 
 
def masgen(n):
    mlist = list(random.randint(-50, 10) for i in range(n))
    print(*mlist)
    print(list(i for i in mlist if i > 0))
 
 
if __name__ == '__main__':
    masgen(n=16)

Добавлено через 19 минут
Матрица

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy 
 
 
def masgen():
    a = numpy.random.randint(-10,40,(8,8))
    print(a)
    res=numpy.where(a>0)
    print(res)
 
 
 
    
 
if __name__ == '__main__':
    masgen()



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

Понравилась статья? Поделить с друзьями:
  • Как найти потерянную вещь нумерология онлайн
  • Как найти группу в вотс апп
  • Как исправить ошибку в первичном документе в закрытом периоде
  • Как найти модуль импульса каждой тележки
  • Как найти торговый сбор