Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在numpy中存储二维数组?_Python_Numpy_Matrix_Scipy - Fatal编程技术网

Python 如何在numpy中存储二维数组?

Python 如何在numpy中存储二维数组?,python,numpy,matrix,scipy,Python,Numpy,Matrix,Scipy,我是numpy新手,我有一个2D对象数组,我需要将其放入一个较小的矩阵中,然后计算每个容器中的对象数量以制作热图。我按照答案创建了容器,并对一个简单的数组进行了计数,但我不知道如何将其扩展到二维。以下是我目前掌握的情况: data_matrix = numpy.ndarray((500,500),dtype=float) # fill array with values. bins = numpy.linspace(0,50,50) digitized = numpy.digitize(dat

我是numpy新手,我有一个2D对象数组,我需要将其放入一个较小的矩阵中,然后计算每个容器中的对象数量以制作热图。我按照答案创建了容器,并对一个简单的数组进行了计数,但我不知道如何将其扩展到二维。以下是我目前掌握的情况:

data_matrix = numpy.ndarray((500,500),dtype=float)
# fill array with values.

bins = numpy.linspace(0,50,50)
digitized = numpy.digitize(data_matrix, bins)

binned_data = numpy.ndarray((50,50))
for i in range(0,len(bins)):
    for j in range(0,len(bins)):
        k = len(data_matrix[digitized == i:digitized == j]) # <-not does not work
        binned_data[i:j] = k
data_matrix=numpy.ndarray((500500),dtype=float)
#用值填充数组。
bins=numpy.linspace(0,50,50)
数字化=numpy.数字化(数据矩阵、箱子)
binned_数据=numpy.ndarray((50,50))
对于范围(0,len(bin))中的i:
对于范围(0,len(bin))内的j:
k=len(data_matrix[digitalized==i:digitalized==j])#一开始你用的是轮子,而不是重新发明轮子,但后来我意识到使用它会有点过头,还需要一些黑客

如果我理解正确,您只需要对输入的子矩阵求和。这很容易暴力:检查输出子矩阵并对输入的每个子块求和:

import numpy as np

def submatsum(data,n,m):
    # return a matrix of shape (n,m)
    bs = data.shape[0]//n,data.shape[1]//m  # blocksize averaged over
    return np.reshape(np.array([np.sum(data[k1*bs[0]:(k1+1)*bs[0],k2*bs[1]:(k2+1)*bs[1]]) for k1 in range(n) for k2 in range(m)]),(n,m))

# set up dummy data
N,M = 4,6
data_matrix = np.reshape(np.arange(N*M),(N,M))

# set up size of 2x3-reduced matrix, assume congruity
n,m = N//2,M//3
reduced_matrix = submatsum(data_matrix,n,m)

# check output
print(data_matrix)
print(reduced_matrix)
这张照片

print(data_matrix)
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]

print(reduced_matrix)
[[ 24  42]
 [ 96 114]]
这确实是对形状的子矩阵求和的结果
(2,3)


请注意,我正在使用
/
进行整数除法,以确保它与python3兼容,但在python2的情况下,您可以使用
/
进行除法(因为涉及的数字是整数)。

您可以将数组重塑为反映所需块结构的四维数组,然后沿每个块内的两个轴求和。例如:

>>> a = np.arange(24).reshape(4, 6)
>>> a
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11],
       [12, 13, 14, 15, 16, 17],
       [18, 19, 20, 21, 22, 23]])
>>> a.reshape(2, 2, 2, 3).sum(3).sum(1)
array([[ 24,  42],
       [ 96, 114]])
如果
a
的形状为
m,n
,则形状应为

a.reshape(m_bins, m // m_bins, n_bins, n // n_bins)

另一种解决方案是查看下面注释中的二进制文件函数:

要使用您的示例:

data_matrix = numpy.ndarray((500,500),dtype=float)
binned_data = binArray(data_matrix, 0, 10, 10, np.sum)
binned_data = binArray(binned_data, 1, 10, 10, np.sum)
结果将
数据矩阵
(大小为500x500)中大小为10x10的所有平方相加,以获得
组合数据
(大小为50x50)中每平方的单个值


希望这有帮助

你能举一个3*3数组或类似数组的简单例子吗?我不明白你的目的。我不确定,也许你想看看
np.historogram2d
?看看这个如果每个轴上的容器数是沿着相应轴的维度的除数,你可以不用任何Python循环(这会快得多)。诀窍是将数组重塑为四维数组,然后沿右轴求和。@SvenMarnach你是对的,我一直忘记了这个诀窍:)你想把它作为答案添加吗?完成。昨天我没有时间发布答案,所以我希望其他人也能这样做。