我将如何采取一个表示物理位置的1D数组,并使每个位置的值为访问计数的2D矩阵?



你好吗?我有一个1D数组,像这样:

locations = [1,2,4,4,3,2,2,4,1,4]

其中每个条目表示对该特定位置的一次访问。在这种情况下,有4个位置- 1,2,3和4。我想把它转换成一个2x2 numpy数组左上角的盒子有访问位置1的次数,右上方的盒子有访问位置2的次数,左下角的盒子有访问位置3的次数,右下角的盒子有访问位置4的次数。

像这样:

np.array([[2,3],[1,4]])

2x2数组图像

当给定一个更大的位置数组时,我该如何以一种可以很好地扩展的方式来做这件事?谢谢你,祝你今天愉快。

您要做的是计算唯一值。下面是一个例子:


import numpy as np
locations = [1,2,4,4,3,2,2,4,1,4]
result = np.array(np.unique(locations, return_counts=True))
print(result)

打印结果将是

array([[1, 2, 3, 4],
[2, 3, 1, 4]])

我认为你的问题有两部分:

  1. 你想要计算在原始数组中出现的每个数字的发生率
  2. 您希望将生成的数组(其中包含每个数字的关联)格式化为方阵。我不清楚你的更一般的情况是否总是只由数字1-4组成(并且总是导致2x2矩阵),或者如果你想考虑更一般的情况,例如,值1-16导致4x4矩阵。我现在假设是前者。

Pieter的答案有一个很好的方法来计算发生率(第1步),但我修改了它,将唯一值与计数分开:

import numpy as np
locations = [1,2,4,4,3,2,2,4,1,4]
values,counts = np.array(np.unique(locations, return_counts=True))

Pieter的答案不返回2x2数组(步骤2),但您可以通过在这里重塑计数数组来获得:

counts2x2=counts.reshape([2,2])
print(counts2x2)

的输出将是:

[[2 3]
[1 4]]

这里有一个警告,如果你的原始数组中没有1-4的值,这个方法将不起作用!也就是说,如果你的原始数组只有1,2,&它只会返回一个长度为3的计数数组,而不是一个长度为4的数组,在3的位置上有一个0。如果你有一个非常大的输入数组,这可能不太可能是一个问题,但如果你想更安全,我建议使用np。直方图,可以更普遍地计算不同箱子中的对象数量:

import numpy as np
locations = [1,2,4,4,3,2,2,4,1,4]
locations_no3 = [1,2,4,4,2,2,2,4,1,4]
hist,edges=np.histogram(locations,bins=np.arange(0.5,5))
hist_no3,edges_no3=np.histogram(locations_no3,bins=np.arange(0.5,5))
print("With 3:")
print(hist.reshape(2,2))
print("Without 3:")
print(hist_no3.reshape(2,2))

输出如下所示。请注意,无论是否所有1-4的数字都在原始数组中表示,此解决方案都有效。

With 3:
[[2 3]
[1 4]]
Without 3:
[[2 4]
[0 4]]

最新更新