以分层方式将一个大的numpy矩阵分成10个独立的子矩阵

2024-04-23 21:09:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个numpy变量,包含32000个条目,如下所示:

>>> files
array(['GAN_0.npy', 'GAN_1.npy', 'GAN_10.npy', ..., 'GAN_822.npy',
       'GAN_8220.npy', 'GAN_8221.npy'], dtype='<U13')
>>> files.shape
(32000,)

>>> labels
array([1, 1, 1, ..., 1, 1, 1])
>>> np.unique(labels)
array([0, 1])
>>> labels.shape
(32000,)

换句话说,第一个变量是字符串的NumPy矩阵,而另一个是整数的NumPy矩阵。在第一个矩阵中,我有一个图像名称的字符串列表,在另一个矩阵中,整数作为我用来识别它们的标签(以名称GAN_u开头的图像是1,而以名称RAW_u开头的图像是0)

我想知道我是否可以将这32000个条目分成10个子集,每个子集包含3200个图像,不重复,其中1600个条目的名称以RAW_u开头,其他1600个条目的名称以GAN_u开头。图像的名称和标签都是无序的,因此我不能简单地将大矩阵拆分为10个子矩阵。因此,Numpy中是否有任何方法可以从Python中的2个类中创建10个分层且独立的样本子矩阵

附:这两个文件可以在here找到


Tags: 字符串图像numpy名称rawlabels条目矩阵
3条回答

以下是一个可能的解决方案:

arrays = [np.concatenate((g, r))
          for g, r in zip(np.array_split(files[labels==1], 10), 
                          np.array_split(files[labels==0], 10))]

此解决方案保持“GAN*”和“RAW*”文件的相对顺序。此外,创建数组时,初始位置用“GAN*”文件填充,其余位置用“RAW*”文件填充。如果您对这种排序不满意,您可以在创建每个数组后对它们进行洗牌

下面是一个没有循环的解决方案(由@Crazy Coder在其他答案的评论中建议):

labels = np.array(labels, dtype=bool)
np.split(np.vstack((files[labels],files[~labels])).T.reshape(-1,1), 10)

我自己的解决方案(基于@CrazyCoder建议)

import numpy as np

#Read file names
file_names=np.genfromtxt('test_files.txt',dtype='str')
   
raw_vector=[]
gan_vector=[]

for i in range(0,file_names.shape[0]):

    image_name=file_names[i]

    #Separate RAW and GAN files
    if("RAW_" in image_name):
        raw_vector.append(image_name)

    if("GAN_" in image_name):
        gan_vector.append(image_name)
    
raw_vector=np.array(raw_vector)
gan_vector=np.array(gan_vector)

#Split into 10 subsets each
raw_vector_divided=np.split(raw_vector,10)
gan_vector_divided=np.split(gan_vector,10)

for j in range(0,10):
    x=raw_vector_divided[j]
    y=gan_vector_divided[j]
    
    x=x.reshape(x.shape[0],1)
    y=y.reshape(y.shape[0],1)
    
    #merge
    experiment_data=np.vstack((x,y))
    
    #Save subset as file
    np.savetxt( 'experiment-' + str(j+1) + '-data.txt',  experiment_data, fmt='%s')

print("finished") 

相关问题 更多 >