Заменить нули в массиве разными значениями для разных половин массива - PullRequest
1 голос
/ 20 апреля 2020

У меня есть массив чисел с плавающей точкой, размер которых заранее неизвестен. В нем и других числах есть нулевые значения. Я хочу заменить его нули на определенное значение только для части массива, скажем, для первой трети массива, другим значением для второй трети и другим значением для последней трети.

I пытался использовать my_array[:my_array.size//3:] = first_value как предложено здесь как часть понимания списка:

my_array = np.asarray([first_value for x in my_array[:my_array.size//3:] if x == 0])

, но это уменьшает массив только до его первой трети. Как я могу заменить нули описанным выше способом?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вы можете использовать маску, чтобы сначала получить нужные индексы, а затем присвоить им любое значение сразу без l oop:

mask = np.where(my_array==0)[0]
my_array[mask[mask<my_array.size//3]] = first_value
my_array[mask[np.logical_and(mask>=my_array.size//3, mask<2*my_array.size//3)]] = second_value
my_array[mask[mask>=2*my_array.size//3]] = third_value

Если вы хотите разделить массив на несколько частей, я бы рекомендуем зацикливать этот код.

Обратите внимание, что это НЕ будет работать, поскольку оно создает копию массива и изменяет это:

#THIS DOES NOT WORK, it changes values of a copy of my_array and not the original array itself
my_array[my_array==0][:my_array.size//3] = first_value
0 голосов
/ 21 апреля 2020

Давайте попробуем использовать al oop для длины массива, которая не всегда может быть разделена на количество частей

import numpy as np

number_of_parts=3
length_of_parts=int(np.ceil(my_array.size/number_of_parts))
Values=[1,2,3]

Parts=[[counter*length_of_parts,min((counter+1)*length_of_parts,my_array.size)]for counter in range(number_of_parts)]

for (start,end),Value in zip(Parts,Values):
     my_array[start,end][my_array[start,end]==0]=Value
...