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

标签 python arrays numpy random numpy-slicing

我正在使用一个 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/

相关文章:

Java Noob 创建自定义方法来打印数组并计算持续时间

php - 我真的需要关于 PHP 中的多个复选框+文本框的建议

python - Pandas 有条件地创建数据框列 : based on multiple conditions

python - 如何将 kivy 中的下拉列表与主按钮中心对齐?

java - java中的Python,可以吗

python - 尝试子类化 Mechanize 浏览器并创建登录方法

python - 用于提取不同格式的日期 (d,m,y) 的通用 Python 正则表达式

c# - 如何确定数组中唯一派生类型的数量?

python - 为什么 np.convolve 将结果信号移动 1

python - 你能通用地编写 numpy 切片吗?