首页 > 解决方案 > 使用 numpy 创建和初始化网格(矩阵)100x100

问题描述

我正在做一项模拟谢林隔离模型的任务。

现在我想知道以下内容:

1)如何使用 numpy 生成具有 100x100 单元的二维矩阵(网格)

2)如何用 1 填充 40% 的 Agent A 的矩阵;40% 的代理 B 有 2 个;并且 20% 是空的,即 0。代理是随机放置的。

我知道有 numpy.ones: numpy.zeroes numpy.array 但我不知道如何创建这样的二维矩阵并用某些值随机填充它。如何迭代?

有些人可以帮助我吗?

谢谢!

标签: pythonnumpy

解决方案


有很多方法,各有利弊。我不会一一列举。

这应该很容易推理,它不是最慢的,但也可能不是最快的,因为我们使用了两个花哨的索引步骤(这里还有一个实际阅读文档的理由!):

代码

import numpy as np

N = 10
a, b, c = 0.4, 0.4, 0.2

def build_mat(N, a, b, c):
    n_a = int(N * N * a)
    n_b = int(N * N * b)
    n_c = N - n_a - n_b

    rng_nonzero_inds_1d = np.random.choice(N*N, n_a + n_b, replace=False)

    mat = np.zeros(N*N)
    mat[rng_nonzero_inds_1d[:n_a]] = 1
    mat[rng_nonzero_inds_1d[n_a:]] = 2

    return mat.reshape((N,N))

mat = build_mat(N, a, b, c)
print('A: ', np.count_nonzero(mat==1))
print('B: ', np.count_nonzero(mat==2))
print('C: ', np.count_nonzero(mat==0))
print(mat)

输出

A:  40
B:  40
C:  20
[[ 1.  1.  2.  0.  2.  1.  0.  2.  1.  2.]
 [ 2.  1.  2.  1.  0.  1.  1.  0.  2.  0.]
 [ 0.  2.  1.  1.  2.  0.  2.  2.  2.  2.]
 [ 1.  0.  2.  1.  2.  2.  0.  1.  2.  0.]
 [ 1.  2.  1.  1.  2.  1.  2.  1.  2.  0.]
 [ 2.  0.  1.  2.  2.  1.  1.  2.  2.  1.]
 [ 0.  2.  1.  1.  2.  1.  1.  2.  0.  2.]
 [ 2.  2.  1.  2.  1.  2.  1.  1.  0.  0.]
 [ 2.  1.  1.  0.  0.  1.  2.  1.  1.  1.]
 [ 1.  1.  2.  2.  1.  2.  2.  0.  0.  1.]]

推荐阅读