Условная нарезка в питоне

Как я могу выбрать определенные строки, где эти строки равны другой строке в другом параллельном массиве? другими словами; можно ли векторизовать код? здесь p, y имеют одинаковую форму

for inx,val in enumerate(p):
    if val ==y[inx]:
        pprob.append(1)
    else:
        pprob.append(0)

person Ahmed Adel    schedule 12.05.2021    source источник
comment
Пожалуйста, опубликуйте полный MCVE   -  person Mad Physicist    schedule 13.05.2021


Ответы (2)


Я только что запустил это в оболочке Python в Python 3.9.4.

import numpy as np

x = np.array([1,2,3,4,5])
y = np.array([1,1,3,3,5])

matching_idx = np.where(x == y) # (array([0, 2, 4]),)

x[matching_idx] # array([1, 3, 5])

Похоже, x[matching_idx] это то, что вам нужно

Ключом к этому является np.where(), описанный здесь

person Joshua Swain    schedule 12.05.2021

import numpy as np

a = np.random.normal(size=(10, 5))
b = np.random.normal(size=(10, 5))

a[1] = b[1]
a[7] = b[7]

rows = np.all(a == b, axis=1).astype(np.int32)
rows = rows.tolist()   # if you really want the result to be a list
print(rows)

Результат, как и ожидалось

[0 1 0 0 0 0 0 1 0 0]

Если вы можете иметь дело с более чем двумя измерениями, измените следующее (работает и для 2d):

# this
np.all(a == b, axis=1)
# to this
np.all(a == b, axis=tuple(range(len(a.shape)))[1:])
person Reti43    schedule 12.05.2021