gpt4 book ai didi

python - 打乱 2D numpy 数组中的位置列表,然后使用它在 3D numpy 数组中进行选择(或切片)

转载 作者:太空宇宙 更新时间:2023-11-03 21:28:58 27 4
gpt4 key购买 nike

我正在使用一个 3D 数组,其中索引数组是 200x200 二进制数组(用于分类)。该数组包含 0 或 1,我需要使用该数组在 3D 数组中选择随机 1000 个 0 位置和随机 1000 个 1 位置。我已经可以创建一个整数列表及其位置,但我无法弄清楚如何随机化该列表并使用它来切片 3D 数组。

下面是我的代码。

index = file.read(1) #a 200 x 200 2D array. it's binary and only contains 1s and 0s in varying clusters.
array1 = file.read(1) #a 200x 200 2D array #first array in the stack this is repeated for the remaining 3
stack = np.dstack((array1, array2, array3, array4, index)) #Note location of 'index'. Also this is now a 3d array.

打印“stack”可以提供此功能。

print(stack)

[[[0.5580524 0.4883823 0.45231035 0.48734677 0.48952746 0.5680048
0.61111915 0.7087597 0.68731683 0.7544603 0.74395233 0.76797485
0.6963369 0.551183 1. ]

...

[0.4401738 0.3988781 0.35379404 0.36442786 0.36919853 0.46986657
0.4414228 0.4944533 0.47824454 0.5220391 0.56117916 0.6202841
0.6201752 0.64005166 0. ]]]

现在使用 numpy.where 从“索引”二维数组生成值及其位置的列表

class_indexes = {}
for class_ in np.unique(index):
class_indexes[class_] = np.where(index == class_)

调用class_indexes的结果如下

class_indexes
{0: (array([ 1, 1, 1, ..., 1511, 1511, 1511]),
array([1797, 1798, 1799, ..., 2001, 2002, 2003])),
1: (array([ 1, 1, 1, ..., 1511, 1511, 1511]),
array([1833, 1834, 1835, ..., 1962, 1963, 1964]))}

另外

len(class_indexes[0][0])
280000

len(class_indexes[1][1])
120000

比赛

np.unique(index, return_counts = True)
(array( 0, 1], dtype=int16), array([280000, 120000]))

我可以使用选择/切片 3D 阵列中的特定位置

print(stack[50:51,75:76])
[[[0.444261 0.43989536 0.47133848 0.4160257 0.5548938 0.44350675
0.6010795 0.48953462 0.6352046 0.5407316 0.72074664 0.69200116
0.58779025 0.5807785 1. ]]]

print(stack[50,75])
[0.444261 0.43989536 0.47133848 0.4160257 0.5548938 0.44350675
0.6010795 0.48953462 0.6352046 0.5407316 0.72074664 0.69200116
0.58779025 0.5807785 1. ]

这就是我陷入困境的地方。重申一下,我想从 3D 数组中随机切片 1000 个以 1 结尾的数组和 1000 个以 0 结尾的数组,但我一生都无法弄清楚如何使用我生成的“class_indexes”来做到这一点。

最佳答案

我想您想创建一个批处理并迭代它们?

您可以创建每个类的排列,然后选择所需的批处理:

p1 = np.random.permutation(280000) // use the length of the class instead of the fixed value
p2 = np.random.permutation(120000)

for i in range(0, batch_size, 120000):
class_indexes[0][p1[i:i+batch_size]]
class_indexes[1][p2[i:i+batch_size]]

当然,由于丢弃了 160000 个元素,这有点浪费,但您仍然可以通过拥有两个索引来使用这些数据,并在需要时创建新的排列。

检查索引的每个元素以了解其作用:

p1[i:i+batch_size]

然后

class_indexes[0][p1[i:i+batch_size]]

关于python - 打乱 2D numpy 数组中的位置列表,然后使用它在 3D numpy 数组中进行选择(或切片),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53654791/

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