我需要转换一个numpy数组如下:
[1,1,1,1] -> [[1],[1],[1],[1]]
z4bn682m1#
使用np.reshape:
np.reshape
import numpy as np values = np.random.randint(1, 10, 10) print(values) values = values.reshape((-1, 1)) print(values)
# Before reshaping [5 9 8 1 2 6 2 2 9 8] # After reshaping [[5] [9] [8] [1] [2] [6] [2] [2] [9] [8]]
使用-1告诉NumPy新形状应该与原始形状兼容(即它应该根据数组中元素的数量计算出该维度的值)。
-1
wa7juj8i2#
虽然不是numpy,但你也可以在普通的Python中使用列表理解来轻松做到这一点:
>>> lst = [1,1,1,1] >>> reshaped = [[el] for el in lst] >>> print(reshaped) [[1], [1], [1], [1]]
hk8txs483#
对于已经给出的.reshape(-1,1),另一种方法是添加一个新轴
.reshape(-1,1)
x=np.arange(4) x[:,None] #array([[0], # [1], # [2], # [3]])
请注意,这两个命令(reshape和[:,None])只创建了原始数组的视图。所以呢
[:,None]
x=np.arange(4) x[:,None][0,0] = 12 x.reshape(-1,1)[1,0]=13 x # [12, 13, 2, 3]
如果你想要一个新的数组,你可能需要.copy()结果。在这种情况下,我不会在.reshape(-1,1)和[:,None]之间有任何偏好。但是当你有一个以上的轴时,后者可能更灵活。例如,假设你有一个2d数组(我在这个例子中使用了reshape)
.copy()
x=np.arange(12).reshape(-1, 4) # here I use reshape, because it is a shape that I want to specify : I want rows of 4. # array([[ 0, 1, 2, 3], # [ 4, 5, 6, 7], # [ 8, 9, 10, 11]])
现在你想把它转换成
array([[ [0], [1], [2], [3]], [ [4], [5], [6], [7]], [ [8], [9], [10], [11]]])
在这种情况下更难使用reshape。你需要知道你的x的形状(当然,这不是最高机密信息,但它变得不那么自然)。你不能x.reshape(-1,-1,1)。你必须要么x.reshape(3,4,1),要么有一个,没有更多的,-1,如x.reshape(3,-1,1)或x.reshape(-1,4,1)。或者,更一般地称为x.reshape(x.shape+(1,))与newaxis一样,由于我们只是添加一个轴,而不是指定轴的大小,因此它仍然与1D相同。
x
x.reshape(-1,-1,1)
x.reshape(3,4,1)
x.reshape(3,-1,1)
x.reshape(-1,4,1)
x.reshape(x.shape+(1,))
newaxis
x[:,:,None] # aka x[:,:,np.newaxis]
所以,当你想重塑事物(改变大小)时,我会让reshape工作,当你只想添加一个新轴时,让newaxis工作(这样写,似乎很明显)。
reshape
7hiiyaii4#
你也可以使用transpose:
A = [1,2,3,4,5,6] np.asarray([A]).T
或
np.transpose([A])
输出:
array([[1], [2], [3], [4], [5], [6]])
4条答案
按热度按时间z4bn682m1#
使用
np.reshape
:使用
-1
告诉NumPy新形状应该与原始形状兼容(即它应该根据数组中元素的数量计算出该维度的值)。wa7juj8i2#
虽然不是numpy,但你也可以在普通的Python中使用列表理解来轻松做到这一点:
hk8txs483#
对于已经给出的
.reshape(-1,1)
,另一种方法是添加一个新轴请注意,这两个命令(reshape和
[:,None]
)只创建了原始数组的视图。所以呢如果你想要一个新的数组,你可能需要
.copy()
结果。在这种情况下,我不会在
.reshape(-1,1)
和[:,None]
之间有任何偏好。但是当你有一个以上的轴时,后者可能更灵活。例如,假设你有一个2d数组(我在这个例子中使用了reshape)现在你想把它转换成
在这种情况下更难使用reshape。你需要知道你的
x
的形状(当然,这不是最高机密信息,但它变得不那么自然)。你不能
x.reshape(-1,-1,1)
。你必须要么x.reshape(3,4,1)
,要么有一个,没有更多的,-1,如x.reshape(3,-1,1)
或x.reshape(-1,4,1)
。或者,更一般地称为x.reshape(x.shape+(1,))
与
newaxis
一样,由于我们只是添加一个轴,而不是指定轴的大小,因此它仍然与1D相同。所以,当你想重塑事物(改变大小)时,我会让
reshape
工作,当你只想添加一个新轴时,让newaxis
工作(这样写,似乎很明显)。7hiiyaii4#
你也可以使用transpose:
或
输出: