Эффективный способ добавить одноэлементное измерение в вектор NumPy, чтобы срезы работали - PullRequest
19 голосов
/ 01 марта 2012

Как в NumPy можно эффективно превратить 1-D объект в 2-D объект, где одноэлементное измерение выводится из текущего объекта (то есть список должен идти либо к вектору 1xlength, либо lengthx1)?

 # 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's still a vector)?

Ответы [ 5 ]

41 голосов
/ 01 марта 2012

В самом общем случае самый простой способ добавить дополнительные измерения в массив - использовать ключевое слово None при индексации в позиции, чтобы добавить дополнительное измерение. Например

my_array = numpy.array([1,2,3,4])

my_array[None, :] # shape 1x4

my_array[:, None] # shape 4x1
4 голосов
/ 01 марта 2012

Почему бы просто не добавить квадратные скобки?

>> my_list
[1, 2, 3, 4]
>>> numpy.asarray([my_list])
array([[1, 2, 3, 4]])
>>> numpy.asarray([my_list]).shape
(1, 4)

.. подождите, подумав, почему ваше назначение среза не выполняется?Это не должно:

>>> 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 голосов
/ 17 апреля 2015

Как насчет 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).

2 голосов
/ 07 мая 2014
import numpy as np
a = np.random.random(10)
sel = np.at_least2d(a)[idx]
1 голос
/ 07 января 2014

Вы всегда можете использовать dstack() для репликации массива:

import numpy

my_list = array([1,2,3,4])
my_list_2D = numpy.dstack((my_list,my_list));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...