начальный a (N 1)-D массив из N-D массива с функцией «значение в 1-D массив»

#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