Python 向ndarray添加附加维度
我已按以下方式定义了和ndarray:Python 向ndarray添加附加维度,python,numpy,Python,Numpy,我已按以下方式定义了和ndarray: dataset = np.ndarray(shape=(len(image_files), image_size, image_size), dtype=np.float32) 此数组表示大小为image\u size*image\u size的图像集合。 所以我可以说,dataset[0]并得到一个与索引为0的图像相对应的2D表 现在我想为这个数组中的每个图像增加一个字段。例如,对于位于索引0的图像,我
dataset = np.ndarray(shape=(len(image_files), image_size, image_size),
dtype=np.float32)
此数组表示大小为image\u size
*image\u size
的图像集合。
所以我可以说,dataset[0]
并得到一个与索引为0
的图像相对应的2D表
现在我想为这个数组中的每个图像增加一个字段。例如,对于位于索引0
的图像,我想存储编号123
,对于位于索引321
的图像,我想存储编号50000
将此附加数据字段添加到现有ndarray的最简单方法是什么?
添加此额外维度后,访问新数组中数据的适当方式是什么?Numpy数组基本上是张量,即它们的形状在轴上是绝对的。这意味着形状是固定的,而不是可变的。比如说,
import numpy as np
x = np.array([[[1,2],[3,4]],
[[5,6],[7,8]]
])
print(x.shape) #Here we have two, 2x2s. Shape = (2,2,2)
如果我想将x[0]
与数字5相关联,将x[1]
与数字7相关联,那么这将类似于(如果可能的话):
但这样的事情是不可能的,因为它“在某种意义上”会有一个对应于(2,((2,2),1))
,或者其他一些模棱两可的形状。这样的对象不是numpy数组或张量。它没有固定的轴尺寸。所有numpy阵列必须具有固定的轴大小。因此,如果要存储新信息,唯一的方法是创建另一个数组
x = np.array([[[1,2],[3,4]],
[[5,6],[7,8]],
])
y = np.array([5,7])
现在
x[0]
对应于y[0]
,x[1]
对应于y[1]
x
具有形状(2,2,2)
和y
具有形状(2,)
如果您洗牌索引数组而不是数据集本身,则可以跟踪原始“标识符”
idx = np.arange(len(image_files))
np.random.shuffle(idx)
shuffle_set = dataset[idx]
说明:
In [20]: x = np.arange(12).reshape(6,2)
...: idx = np.arange(6)
...: np.random.shuffle(idx)
In [21]: x
Out[21]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
In [22]: x[idx] # shuffled
Out[22]:
array([[ 4, 5],
[ 0, 1],
[ 2, 3],
[ 6, 7],
[10, 11],
[ 8, 9]])
In [23]: idx1=np.argsort(idx)
In [24]: idx
Out[24]: array([2, 0, 1, 3, 5, 4])
In [25]: idx1
Out[25]: array([1, 2, 0, 3, 5, 4])
In [26]: Out[22][idx1] # recover original order
Out[26]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
我不认为在数组中添加第四维是正确的方法。也许字典是更好的方法?图像可以是一个值,数字可以是第二个值,每个值用不同的键存储。你是说一个额外的python字典,其中包含一个image_数据键,一个值就是我要添加的数字吗?这样做的问题是,上面提到的现有代码数据集中已经使用了。这就是更改数据结构的问题所在。例如,在现有代码中,我在该数组上使用了np.random.shuffle。如果地图上有一些信息,图像与其属性之间的对应关系就会丢失,我看不出你的困境。我提出这种方法是因为,正如@Bobby Ocean所暗示的那样,如果你向数组中添加一个额外的维度,它将使数据以指数级的速度增大。一个100x100X1(10000个元素)数组将变成100x100x2(20000个元素)数组来存储一个额外的数字。现在用更大的图像将其扩展到4维…谢谢,@hpaulj。这正是我所需要的。这解决了我的问题。
In [20]: x = np.arange(12).reshape(6,2)
...: idx = np.arange(6)
...: np.random.shuffle(idx)
In [21]: x
Out[21]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])
In [22]: x[idx] # shuffled
Out[22]:
array([[ 4, 5],
[ 0, 1],
[ 2, 3],
[ 6, 7],
[10, 11],
[ 8, 9]])
In [23]: idx1=np.argsort(idx)
In [24]: idx
Out[24]: array([2, 0, 1, 3, 5, 4])
In [25]: idx1
Out[25]: array([1, 2, 0, 3, 5, 4])
In [26]: Out[22][idx1] # recover original order
Out[26]:
array([[ 0, 1],
[ 2, 3],
[ 4, 5],
[ 6, 7],
[ 8, 9],
[10, 11]])