#python #numpy #numpy-ndarray
#python #numpy #numpy-ndarray
Вопрос:
У меня есть функция для преобразования значения в список (или массив). Как я могу использовать его для преобразования N-D массива в другой (N 1) -D массив? Приведенный ниже код должен сгенерировать список, а затем преобразовать в <numpy.ndarray> . Мне интересно, есть ли более эффективный способ (может быть, какой-нибудь конструктор для <numpy.ndarray> ?).
# # assume we have a function foo
# def foo(val):
# return [val*10, val*20 - 7]
# # how can we use this function to convert a N-D array to another (N 1)-D array?
# # here is my tried
import numpy as np
def foo(val):
return [val*10, val*20 - 7]
a = np.arange(3) # 'numpy.ndarray', [0 1 2]
b = [foo(val) for val in a]
print (type(b)) # not good, it is a 'list'
print (b) # [[0, -7], [10, 13], [20, 33]]
b = np.array(b).reshape((3, 2))
print (type(b)) # this is what I want 'numpy.ndarray'
print (b) # will be what I want:
# [[ 0 -7]
# [10 13]
# [20 33]]
Если для этого нет конструктора <numpy.ndarray> . Должен ли я сгенерировать новый ndarray (возможно, с помощью «numpy.zeros») и заполнить значение? Или рекомендуется сгенерировать список, а затем преобразовать его в ndarray? Не уверен, какой из них быстрее.
Спасибо!
Ответ №1:
Вы можете напрямую возвращать массив numpy из своей функции:
def foo(val):
return np.column_stack((val*10, val*20 - 7))
Поскольку val*10
вызывается поэлементное умножение (частный случай трансляции numpy), результатом будет другой массив той же формы. То же самое относится к val*20 - 7
. Затем column_stack()
просто соедините два массива вместе, чтобы получить желаемую конечную форму вывода.
Для общего случая (от N-D до (N 1)-D) вы можете использовать:
def foo(val):
return np.stack((val*10, val*20 - 7), axis=-1)
который будет складывать ваши N-D массивы в (N 1)-D массив по последнему измерению.
Комментарии:
1. Хороший момент! Я только что попробовал и обнаружил, что он работает от 1-D массива до 2-D массива. Однако, если значение равно 2-D массиву, функция foo не вернет 3-D массив, все еще изучая, почему…
2. @GarlicTseng Я отредактировал ответ для общего случая N-D