Как изменить массив numpy по ссылке в функции? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь создать функцию, которая изменяет список массивов numpy и преобразует их в определенный тип данных. У меня возникают проблемы с изменением массива numpy.

Пример:

>> a = ['1', '2']
>> convert(int, a)
>> a
a = [1, 2]

Этот код работает, когда функция представляет собой обычный массив, поскольку d [:] ссылается на массив, а не на копия.

# data - data to be converted
# func - type of data 
def convert(func, *data):
    for d in data:
        d[:] = list(map(func, d))

Этот код по какой-то причине не работает, и я озадачен, почему и как я могу это исправить.

def convert(func, *data):
    for d in data:
        d[:] = d.astype(func)

В качестве альтернативы:

def convert(func, *data):
    for i in range(len(data)):
        data[i][:] = np.array( np.zeros(len(data[i]))) # works -> sets array outside function to 0s
        data[i][...] = data[i].astype(func) # doesn't work

Как можно сделать это в numpy?

1 Ответ

0 голосов
/ 18 февраля 2020

Строковый массив dtype:

In [467]: b                                                                                    
Out[467]: array(['1', '2'], dtype='<U10')

создать новый массив с типом int dtype:

In [468]: b.astype(int)                                                                        
Out[468]: array([1, 2])

Присвоение этих значений обратно b преобразует их обратно b's dtype:

In [469]: b[:] = b.astype(int)                                                                 
In [470]: b                                                                                    
Out[470]: array(['1', '2'], dtype='<U10')

astype создает новый массив; Вы не можете изменить dtype массива на месте.

===

Используя *data, вы просто заключаете список или массив в кортеж. Передайте ['1','2'], и data станет (['1', '2'],), and d is just that list. The* data`, а l oop ничего не внесет в проблему (если вы не хотите преобразовать несколько списков).

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