Numpy ndarrays: возможно ли получить доступ к строке на основе элемента-члена?

Скажем, у меня есть ndarray 2x3:

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

Я хочу заменить {любую строку с 0 в первом индексе} на [0,0,0]:

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

Можно ли это сделать с помощью np.where? Вот моя попытка:

import numpy as np
arr = np.array([[0,1,1],[1,1,1]])
replacement = np.full(arr.shape,[0,0,0])
new = np.where(arr[:,0]==0,replacement,arr)

Я встретил следующую ошибку в последней строке:

ValueError: operands could not be broadcast together with shapes (2,) (2,3) (2,3) 

Ошибка имеет смысл, но я не знаю, как исправить код для достижения моей цели. Любой совет будет принят с благодарностью!

Редактировать: Я пытался упростить многомерный случай, но оказалось, что он не может быть обобщен.

Если у меня есть этот ndarray:

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

как заменить первую тройку на [0,0,0]?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Простая индексация/трансляция сделает:

a[a[:,0]==0] = [0,0,0]

выход:

array([[0, 0, 0],
       [1, 1, 1]])

объяснение:

# get first column
a[:,0]
# array([0, 1])

# compare to 0 creating a boolean array
a[:,0]==0
# array([ True, False])

# select rows where the boolean is True
a[a[:,0]==0]
# array([[0, 1, 1]])

# replace those rows with new array
a[a[:,0]==0] = [0,0,0]
используя np.where

это менее элегантно, на мой взгляд:

a[np.where(a[:,0]==0)[0]] = [0,0,0]

Обновлено: обобщение

вход:

a = np.arange(3**3).reshape((3,3,3))

array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

трансформация:

a[a[...,0]==0] = [0,0,0]

array([[[ 0,  0,  0],
        [ 3,  4,  5],
        [ 6,  7,  8]],

       [[ 9, 10, 11],
        [12, 13, 14],
        [15, 16, 17]],

       [[18, 19, 20],
        [21, 22, 23],
        [24, 25, 26]]])

Большое спасибо за ответ. К сожалению, я думаю, что сформулировал проблему таким образом, что это не обобщает мой конкретный случай. Как бы это работало, если бы я хотел заменить списки axis=2 на основе элемента?

kournex 18.03.2022 09:57

@kournex, можете ли вы обновить свой вопрос примерами?

mozway 18.03.2022 09:58

Я только что обновил, дайте мне знать, если что-то непонятно :)

kournex 18.03.2022 10:04

@kournex проверьте обновление, это точно такая же логика, с индексацией последнего измерения;)

mozway 18.03.2022 10:15

Это сделало трюк! Спасибо за вашу помощь! (кто знал, что у питона есть эллипсы!?)

kournex 18.03.2022 10:24

Другие вопросы по теме