向NumPy向量添加单重维度以便进行切片分配的有效方法

2024-03-29 07:38:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在NumPy中,如何有效地将一维对象转换成二维对象,其中从当前对象推断出单重维度(即列表应该指向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)?

Tags: theto对象numpyindexthatmysome
3条回答

在最常见的情况下,向数组添加额外维度的最简单方法是在添加额外维度的位置进行索引时使用关键字None。例如

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

my_array[None, :] # shape 1x4

my_array[:, None] # shape 4x1

为什么不简单地加上方括号呢?

>> 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.]])

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)

相关问题 更多 >