Numpy: как присваивать значения отдельным элементам многомерных массивов? - PullRequest
4 голосов
/ 05 ноября 2011

Я работаю с 3-мерными массивами (для целей этого примера вы можете представить, что они представляют значения RGB в координатах X, Y экрана).

>>> import numpy as np
>>> a = np.floor(10 * np.random.random((2, 2, 3)))
>>> a
array([[[ 7.,  3.,  1.],
        [ 9.,  6.,  9.]],

       [[ 4.,  6.,  8.],
        [ 8.,  1.,  1.]]])

Что бы я хотелсделать, это установить произвольное значение G-канала для тех пикселей, чей G-канал уже ниже 5 .Мне удается выделить нужный мне пиксель:

>>> a[np.where(a[:, :, 1] < 5)]
array([[ 7.,  3.,  1.],
       [ 8.,  1.,  1.]])

, но я пытаюсь понять, как назначить новое значение только для канала G.Я попытался:

>>> a[np.where(a[:, :, 1] < 5)][1] = 9
>>> a
array([[[ 7.,  3.,  1.],
        [ 9.,  6.,  9.]],

       [[ 4.,  6.,  8.],
        [ 8.,  1.,  1.]]])

... но, похоже, не дает никакого эффекта.Я также попытался:

>>> a[np.where(a[:, :, 1] < 5), 1] = 9
>>> a
array([[[ 7.,  3.,  1.],
        [ 9.,  9.,  9.]],

       [[ 4.,  6.,  8.],
        [ 9.,  9.,  9.]]])

... (не понимая, что происходит).Наконец я попытался:

>>> a[np.where(a[:, :, 1] < 5)][:, 1] = 9
>>> a
array([[[ 7.,  3.,  1.],
        [ 9.,  6.,  9.]],

       [[ 4.,  6.,  8.],
        [ 8.,  1.,  1.]]])

Я подозреваю, что мне не хватает чего-то фундаментального о том, как работает NumPy (это первый раз, когда я использую библиотеку).Буду признателен за помощь в достижении того, чего я хочу, а также за объяснение того, что произошло с моими предыдущими попытками.

Заранее большое спасибо за вашу помощь и опыт!

РЕДАКТИРОВАТЬ : результат, который я хотел бы получить:

>>> a
array([[[ 7.,  9.,  1.],     # changed the second number here
        [ 9.,  6.,  9.]],

       [[ 4.,  6.,  8.],
        [ 8.,  9.,  1.]]])   # changed the second number here

Ответы [ 2 ]

3 голосов
/ 05 ноября 2011
>>> import numpy as np
>>> a = np.array([[[ 7.,  3.,  1.],
...         [ 9.,  6.,  9.]],
...
...        [[ 4.,  6.,  8.],
...         [ 8.,  1.,  1.]]])
>>> a
array([[[ 7.,  3.,  1.],
        [ 9.,  6.,  9.]],

       [[ 4.,  6.,  8.],
        [ 8.,  1.,  1.]]])

>>> a[:,:,1][a[:,:,1] <; 5 ] = 9
>>> a
array([[[ 7.,  9.,  1.],
        [ 9.,  6.,  9.]],

       [[ 4.,  6.,  8.],
        [ 8.,  9.,  1.]]])

a[:,:,1] дает вам канал G, я поднастроил его на a[:,:,1] < 5, используя его в качестве индекса. затем присваивается значение 9 выбранным элементам.

1 голос
/ 05 ноября 2011

нет необходимости использовать where, вы можете напрямую индексировать массив с помощью логического массива, полученного из вашего оператора сравнения.

a=array([[[ 7.,  3.,  1.],
          [ 9.,  6.,  9.]],
         [[ 4.,  6.,  8.],
          [ 8.,  1.,  1.]]])


>>> a[a[:, :, 1] < 5]
array([[ 7.,  3.,  1.],
       [ 8.,  1.,  1.]])

>>> a[a[:, :, 1] < 5]=9

>>> a
array([[[ 9.,  9.,  9.],
        [ 9.,  6.,  9.]],
       [[ 4.,  6.,  8.],
        [ 9.,  9.,  9.]]])

Вы не перечислили ожидаемый результат в своем вопросе, поэтому я не уверен, что это то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...