Как сгенерировать матрицу следующим образом? - PullRequest
0 голосов
/ 05 октября 2019

Итак, учитывая число n и массив a, нам нужно создать матрицу n на len(a), где i,j -й элемент матрицы равен 1, если i равно j ая запись a и -1 в противном случае. А именно, для каждого числа i от 0 до n-1 нам нужен массив, который сообщает нам, равно ли число i массиву a.

Было бы здоровоесли бы у нас была особенность карты, как в функциональном программировании. Тогда я мог бы просто создать строки, проверив для каждого элемента в массиве a, равен ли этот элемент заданному числу или нет.

Так есть ли функция, которую я могу использовать, как показано ниже?

result=[]
for i in range(n):
    result=np.vstack(result, np.map(checkequals(x,i),a)
return result

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Обычно функциональный или картографический подход не оптимален для numpy. numpy - это все о массивах, поэтому лучше всего подумать о строительных блоках всего массива, которые предоставляет numpy. Они работают в скомпилированном коде.

Например, в вашем случае:

Определите массив:

In [10]: a = np.random.randint(0,10,9)                                          
In [11]: a                                                                      
Out[11]: array([6, 0, 2, 5, 0, 5, 2, 0, 1])

Сравните его с диапазоном значений n - используя целоемассив == test (и broadcasting. Результатом является логический массив, значение True / False для каждого (i, j):

In [12]: np.arange(8)[:,None]==a                                                
Out[12]: 
array([[False,  True, False, False,  True, False, False,  True, False],
       [False, False, False, False, False, False, False, False,  True],
       [False, False,  True, False, False, False,  True, False, False],
       [False, False, False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False, False, False],
       [False, False, False,  True, False,  True, False, False, False],
       [ True, False, False, False, False, False, False, False, False],
       [False, False, False, False, False, False, False, False, False]])

Учитывая, что его легко отобразить на(-1,1) значений. np.where является лишь одним из таких способов:

In [13]: np.where(np.arange(8)[:,None]==a, 1, -1)                               
Out[13]: 
array([[-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, -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, -1, -1],
       [ 1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1]])

Ближе к вашей идее карты, мы могли бы определить функцию, которая работает с парой скалярных значений:

def foo(i,x):
    if i==x:
        return 1
    else:
        return -1

и используйте np.vectorize для создания функции, которая принимает 2 массива и передает пары скаляров этой функции.

In [16]: np.vectorize(foo)(np.arange(8)[:,None], a)                              
Out[16]: 
array([[-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, -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, -1, -1],
       [ 1, -1, -1, -1, -1, -1, -1, -1, -1],
       [-1, -1, -1, -1, -1, -1, -1, -1, -1]])

Но это НАМНОГО медленнее, чем первый подход.

Подход к пониманию списка:

In [22]: [[(1 if i==x else -1) for x in a] for i in range(8)]                   
Out[22]: 
[[-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, -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, -1, -1],
 [1, -1, -1, -1, -1, -1, -1, -1, -1],
 [-1, -1, -1, -1, -1, -1, -1, -1, -1]]

, который затем можно превратить в массив (это может быть на самом деле быстрее, чем подход vectorize).

0 голосов
/ 05 октября 2019

Python2 имеет встроенную функцию карты , как и python3 . Numpy имеет векторизация

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