gpt4 book ai didi

python - numpy vstack 空初始化

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:31 26 4
gpt4 key购买 nike

我有 vstacked 图像数据,现在我希望将其拆分为训练集和测试集。但是如何初始化一个空的 numpy 数组以便我可以开始 vstacking?

我的简化代码如下所示:

#k-fold the data
kf = cross_validation.KFold(n, n_folds=2)
fold = 0
for train_ind, test_ind in kf:
#Get the persons of k-fold
train_pers = unique[train_ind]
test_pers = unique[test_ind]

#Set train+test stack to empty
self.train_stack = type(self.pca_data[0])
self.test_stack = type(self.pca_data[0])

#For all test data
for data in range(len(self.pca_data)):
print(self.pca_pers[data])
if self.pca_pers[data] in train_pers:
#Add to train stack
self.train_stack = np.vstack((self.train_stack, self.pca_data[data]))

elif self.pca_pers[data] in test_pers:
#Add to test stack
self.test_stack = np.vstack((self.test_stack, self.pca_data[data]))
else:
#Something wrong
print(data)
sys.exit("Strange strange data")

fold += 1

这里的导入代码是:

#Set train+test stack to empty
self.train_stack = type(self.pca_data)
self.test_stack = type(self.pca_data)

#Add to train stack
self.train_stack = np.vstack((self.train_stack, self.pca_data[fold][data]))

self.pca_data包含所有图像数据,该数据必须分布在self.train_stackself.test_stack上。我尝试了 type() 函数,但这似乎是错误的。我也尝试了 self.train_stack = [],但这会引发错误“ValueError:数组维度必须一致,d_0 除外”。如果我使用 numpy.zeros,那么第一个堆栈是 0,并且我希望它在 vstacking 之前完全为空。

问题

初始化空 numpy 数组的正确方法是什么? (输入“numpy.ndarray”)

附:请注意,self.train_stack处于循环中,因此 if 语句,如果变量不存在,则在第二次进入循环时不会重置变量。

变量

  • self.pca_data: Shape(978, 20) 类型(类型 'numpy.ndarray')
  • self.pca_pers:形状(978, 1)类型(类型“numpy.ndarray”)
  • self.test_stack 和 self.train_stack 应该用于例如Shape(489, 20) 和 Shape(489, 20) 类似 self.pca_data
  • 您可以忽略的其他变量

最佳答案

避免在循环中调用np.vstack。每次你这样做时,分配一个新数组,并且原始数组和新行中的所有数据都被复制到新数组中。所有这些复制都会使这样的解决方案比必要的速度慢。

如果我们可以假设self.pca_data的每一行都属于self.train_stackself.test_stack,那么你可以替换整个for循环

for data in range(len(self.pca_data)):
...

调用 np.in1d创建一个 bool 掩码,然后通过使用掩码索引 self.pca_data 来定义 self.train_stackself.test_stack:

for fold, (train_ind, test_ind) in enumerate(kf):
train_pers = unique[train_ind]
mask = np.in1d(self.pca_pers[:,0], train_pers)
self.train_stack = self.pca_data[mask]
self.test_stack = self.pca_data[~mask]
<小时/>

例如,np.in1d 创建一个 bool 数组,当元素为 True在第一个类似数组中是在第二个类似数组中:

In [544]: np.in1d(range(5), [1,2,4])
Out[544]: array([False, True, True, False, True], dtype=bool)

bool 索引可用于选择如下所示的行:

In [545]: mask = np.in1d(range(5), [1,2,4])

In [546]: x = np.arange(10).reshape(5,-1)

In [547]: x
Out[547]:
array([[0, 1],
[2, 3],
[4, 5],
[6, 7],
[8, 9]])

In [548]: x[mask]
Out[548]:
array([[2, 3],
[4, 5],
[8, 9]])

关于python - numpy vstack 空初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27303225/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com