你好吗?我有一个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-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]]