簡體   English   中英

numpy vstack空初始化

[英]numpy vstack empty initialization

我已經對圖像數據進行了vstack,現在我希望將其分為訓練和測試集。 但是,如何初始化一個空的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”)

ps注意, self.train_stack在循環中,因此,如果變量不存在,則if語句將在第二次進入循環時不會重置變量。

變量

  • self.pca_data:Shape(978,20)Type(類型'numpy.ndarray')
  • self.pca_pers:Shape(978,1)Type(類型'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-loop

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

調用np.in1d創建一個布爾掩碼,然后通過使用掩碼索引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創建一個布爾數組,當第一個類似數組的元素在第二個類似數組中時,該數組為True

In [544]: np.in1d(range(5), [1,2,4])
Out[544]: array([False,  True,  True, False,  True], dtype=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]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM