Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向ndarray添加附加维度_Python_Numpy - Fatal编程技术网

Python 向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的图像,我

我已按以下方式定义了和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
的图像,我想存储编号
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]])