Эффективный способ добавить одноэлементный размер к вектору NumPy так, чтобы выполнялись назначения срезов
В NumPy, как вы можете эффективно превратить одномерный объект в двумерный объект, где одномерное измерение выводится из текущего объекта (т.е. список должен перейти к вектору 1xlength или lengспасибо1)?
# This comes from some other, unchangeable code that reads data files.
my_list = [1,2,3,4]
# What I want to do:
my_numpy_array[some_index,:] = numpy.asarray(my_list)
# The above doesn't work because of a broadcast error, so:
my_numpy_array[some_index,:] = numpy.reshape(numpy.asarray(my_list),(1,len(my_list)))
# How to do the above without the call to reshape?
# Is there a way to directly convert a list, or vector, that doesn't have a
# second dimension, into a 1 by length "array" (but really it still a vector)?
Ответы
Ответ 1
В наиболее общем случае самым простым способом добавления дополнительных измерений в массив является использование ключевого слова None
при индексировании в позиции для добавления дополнительного измерения. Например
my_array = numpy.array([1,2,3,4])
my_array[None, :] # shape 1x4
my_array[:, None] # shape 4x1
Ответ 2
Почему бы просто не добавить квадратные скобки?
>> my_list
[1, 2, 3, 4]
>>> numpy.asarray([my_list])
array([[1, 2, 3, 4]])
>>> numpy.asarray([my_list]).shape
(1, 4)
.. подождите, с другой стороны, почему ваше назначение slice не работает? Он не должен:
>>> my_list = [1,2,3,4]
>>> d = numpy.ones((3,4))
>>> d
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
>>> d[0,:] = my_list
>>> d[1,:] = numpy.asarray(my_list)
>>> d[2,:] = numpy.asarray([my_list])
>>> d
array([[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.],
[ 1., 2., 3., 4.]])
даже
>>> d[1,:] = (3*numpy.asarray(my_list)).T
>>> d
array([[ 1., 2., 3., 4.],
[ 3., 6., 9., 12.],
[ 1., 2., 3., 4.]])
Ответ 3
Как насчет expand_dims?
np.expand_dims(np.array([1,2,3,4]), 0)
имеет форму (1,4)
, а
np.expand_dims(np.array([1,2,3,4]), 1)
имеет форму (4,1)
.
Ответ 4
import numpy as np
a = np.random.random(10)
sel = np.at_least2d(a)[idx]
Ответ 5
Вы всегда можете использовать dstack()
для репликации массива:
import numpy
my_list = array([1,2,3,4])
my_list_2D = numpy.dstack((my_list,my_list));
Ответ 6
Из python3.5 вы также можете использовать распаковку с np.ndarray.shape
внутри np.reshape
:
>>> my_array = np.array([1,2,3,4])
>>> my_array.reshape(1, *my_array.shape)
array([[1, 2, 3, 4]])
>>> my_array.reshape(*my_array.shape, 1)
array([[1],
[2],
[3],
[4]])
my_array.reshape(1, *my_array.shape)
работает и в более старых версиях, но не в последнем.