Измените содержимое массива в python - PullRequest
3 голосов
/ 07 апреля 2020

У меня есть многомерный массив (назовем его 'data'), я печатаю его так:

[[[255, 255, 255]
  [255, 255, 255]
  [0, 0, 0]
  [255, 255, 255]]
 [[0, 0, 0]
  [255, 255, 255]
  [0, 0, 0]
  [0, 0, 0]]
  ... and so on
  [255, 255, 255]]]

Я хочу изменить содержимое данных следующим образом

[[1,
  1,
  0,
  1]
 [0,
  1,
  0,
  0]
  ... and so on
  1]]

[255, 255, 255] становится 1, а [0, 0, 0] становится 0

Я пытаюсь с numpy.where, но я в отчаянии Как это сделать в python программировании?

Ответы [ 3 ]

2 голосов
/ 07 апреля 2020

Один из способов - проверить, является ли значение 255, и уменьшить логический результат с помощью np.logical_and

np.logical_and.reduce(a==255, axis=2).view('i1') 

Для следующего примера:

a = np.array([[[255, 255 ,255],
               [255, 255, 255],
               [0 ,0, 0],
               [255, 255 ,255]],
              [[0 ,0, 0],
               [255, 255 ,255],
               [0 ,0, 0],
               [0 ,0, 0]]])

np.logical_and.reduce(a==255, axis=2).view('i1') 

array([[1, 1, 0, 1],
       [0, 1, 0, 0]], dtype=int8)
1 голос
/ 07 апреля 2020

попробуйте это:

data = [
    [
        [255, 255, 255],
        [255, 255, 255],
        [0, 0, 0],
        [255, 255, 255]
    ],
    [
        [0, 0, 0],
        [255, 255, 255],
        [0, 0, 0],
        [0, 0, 0],
    ],
    [
        [255, 255, 255],
        [255, 255, 255],
        [0, 0, 0],
        [0, 0, 0],
    ]
]

result = [[1 if y == [255, 255, 255] else 0 for y in x] for x in data]
print(result)

Имейте в виду, что это сработает, если единственными возможными значениями будут [255, 255, 255] или [0, 0, 0] (это то, что я понимаю из вопроса)

0 голосов
/ 07 апреля 2020

Вот как я бы это сделал:

Использование tuple(col) == (255, 255, 255) важно, потому что значение истинности массива с более чем одним элементом неоднозначно.

data = np.asarray(im) # (assuming this is how you got your data)

new_data = np.array(np.zeros((len(data),len(data[0]))))

for x,row in enumerate(data):
    for y,col in enumerate(row):
        if tuple(col) == (255, 255, 255):
            new_data[x][y] = 1

print(new_data)

Или в одном строка:

new_data = [[1 if tuple(col) == (255, 255, 255) else 0 for col in row] for row in data]

Первое приведет к массиву numpy, а второе - просто к списку. Однако вы можете преобразовать его в массив numpy, используя:

new_data = np.array([[1 if tuple(col) == (255, 255, 255) else 0 for col in row] for row in data])
...