Скажем, у меня есть 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]
?
Простая индексация/трансляция сделает:
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]]])
@kournex, можете ли вы обновить свой вопрос примерами?
Я только что обновил, дайте мне знать, если что-то непонятно :)
@kournex проверьте обновление, это точно такая же логика, с индексацией последнего измерения;)
Это сделало трюк! Спасибо за вашу помощь! (кто знал, что у питона есть эллипсы!?)
Большое спасибо за ответ. К сожалению, я думаю, что сформулировал проблему таким образом, что это не обобщает мой конкретный случай. Как бы это работало, если бы я хотел заменить списки axis=2 на основе элемента?