Присвоить значение отсутствующим данным, которых еще нет в массиве

У меня есть простой массив a, содержащий девять значений от 1 до 10. Отсутствующей точке данных в этом массиве присваивается значение 0.

Мне нужно заменить это значение в массиве значением 0<x>10, но, что особенно важно, это не может быть значение, которое уже присутствует во входном массиве.

import numpy as np
def Data(a):
    b = np.arange(1,10)
    a[a==0] = b[b != a]
    return a

Я пробовал это, но, похоже, сравниваются a[0] с b[0], затем a[1] и b[1].

Мне нужно сравнить b[0] со всеми значениями в массиве a. Если значение b[0] не найдено нигде в a, то мне нужно, чтобы оно заменило значение 0 (отсутствующая точка данных в массиве a) точно на b[0].

Любой умный и простой способ сделать это?


person CTHREEPO    schedule 08.02.2015    source источник
comment
Заменить все нули одним и тем же значением или разными значениями? Что делать, если нет (или достаточно) замен?   -  person jonrsharpe    schedule 08.02.2015
comment
В этом я предполагаю, что только одно значение будет равно 0 и что всегда будет отсутствовать только одно число.   -  person CTHREEPO    schedule 08.02.2015
comment
Это кажется относительно хрупким предположением. Но в этом случае я бы предложил два шага: 1. Найдите недостающее значение. 2. Замените на него ноль.   -  person jonrsharpe    schedule 08.02.2015


Ответы (2)


Я думаю, вы ищете numpy.in1d, что-то вроде:

a[a == 0] = b[~np.in1d(b, a)]

Для логических массивов ~ действует как not.

person Bi Rico    schedule 08.02.2015
comment
Это сделало это для меня. Спасибо. - person CTHREEPO; 10.02.2015

Что-то вроде этого обеспечит наличие уникальных элементов в a, а также заменит значения 0 уникальным значением в range(1,11).

>>> a = [1,2,10,0,4,0,0,3,7]
>>> unique = set()
>>> a = [x if x not in unique and not unique.add(x) else 0 for x in a]
>>> new = list(set(range(1,11)) - unique)
>>> from random import shuffle
>>> shuffle(new)  # this step may be unnecessary...
>>> [new.pop() if x is 0 else x for x in a]
[1, 2, 10, 9, 4, 8, 6, 3, 7]
person Community    schedule 08.02.2015