如何转换两个关联的数组,以便元素均匀分布?

时间:2018-01-16 18:04:09

标签: arrays python-3.x sorting find-occurrences

有两个数组,一个图像数组和一个相应标签的数组。 (例如数字图片及其值) 标签中的出现分布不均匀。 Distribution of the labels

我想要的是以这样的方式切割两个阵列,使标签均匀分布。例如。每个标签出现2次。

为了测试我刚刚创建了两个1D阵列并且它正在工作:

labels = np.array([1, 2, 3, 3, 1, 2, 1, 3, 1, 3, 1,])
images = np.array(['A','B','C','C','A','B','A','C','A','C','A',])
x, y = zip(*sorted(zip(images, labels)))

label = list(set(y))
new_images = []
new_labels = []
amount = 2

for i in label:
    start = y.index(i)
    stop = start + amount
    new_images = np.append(new_images, x[start: stop])
    new_labels = np.append(new_labels, y[start: stop])

我得到/想要的是:

new_labels:  [ 1.  1.  2.  2.  3.  3.]
new_images:  ['A' 'A' 'B' 'B' 'C' 'C']

(没有必要对数组进行排序)

但是当我尝试使用正确的数据(images.shape =(35000,32,32,3),labels.shape =(35000))时,我遇到了错误:
ValueError:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

这对我没什么帮助: ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我认为我的解决方案无论如何都很脏。有没有办法做得对?

非常感谢你!

1 个答案:

答案 0 :(得分:1)

当你的标签相等时,sort函数会尝试对它作为输入的元组的第二个值进行排序,因为在真实数据的情况下这是一个数组(而不是1D数据),它不能比较它们并引发此错误。

让我更详细地解释一下:

x, y = zip(*sorted(zip(images, labels)))

首先,您可以压缩图像和标签。这意味着,您使用图像和标签的相应元素创建元组。第一个元素来自图像的第一个元素,等等。

如果是真实数据,每个标签都与一个形状为(32,32,3)的数组配对。

其次,你对所有这些元组进行排序。此函数首先尝试对元组的第一个元素进行排序。但是,当它们相等时,它将尝试对元组的第二个元素进行排序。由于它们是数组,因此无法比较它们会引发错误。

您可以通过明确告诉已排序的函数仅对第一个元组元素进行排序来解决此问题。

x, y = zip(*sorted(zip(images, labels), key=lambda x: x[0]))

如果需要性能,使用itemgetter会更快。

from operator import itemgetter
x, y = zip(*sorted(zip(images, labels), key=itemgetter(0)))