我有一个3D NumPy数组,它实际上是一个矩阵array.我想使用以下方法将对角线设置为零.当我打印元组和din时,它是完全相同的,但它返回不同的数组视图.

m = np.random.normal(0, 0.2, (10, 4, 4))
din = np.diag_indices(m.shape[1], ndim = 2)

m[:, np.array([0,1,2,3]), np.array([0,1,2,3])]) # It returns an array of diagonals as expected
m[:, tuple(din)] # It returns the array

我在这里错过了什么?

推荐答案

正如 comments 中所述,您需要解包索引.

从python3.11开始,您可以使用:

m[:, *din]

输出:

array([[ 8.61622699e-02, -1.46919069e-01, -9.37771599e-02,
         1.94698315e-03],
       [ 1.60933774e-01, -2.77077615e-02, -1.74135776e-01,
        -1.72223723e-01],
       [-1.54804225e-01,  1.08146714e-01,  2.51844877e-01,
        -2.91622737e-02],
       [ 1.22213756e-02,  1.59703456e-02, -1.41757563e-01,
        -5.02470362e-02],
       [ 1.49296012e-01, -9.60208199e-03, -4.82484338e-01,
         1.58012139e-02],
       [-3.09847219e-01, -1.13959996e-01, -6.71019475e-01,
         3.17810448e-01],
       [ 2.04860543e-04, -2.16311908e-01,  1.39098046e-01,
        -1.40102017e-01],
       [-5.82402679e-02,  2.55831587e-01, -3.74597159e-01,
         1.23205316e-01],
       [-1.23942861e-01,  1.40365188e-02, -2.16884333e-02,
        -2.08800511e-02],
       [ 1.02934324e-01, -1.81953630e-01,  2.35600757e-01,
        -2.29315601e-01]])

然而,这种语法在旧的Python版本中不支持,在这种情况下,你可以构建一个元组:

m[tuple((slice(None), *din))]

# or
m[(slice(None), *din)]

Python相关问答推荐

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

用合并列替换现有列并重命名

如何从在虚拟Python环境中运行的脚本中运行需要宿主Python环境的Shell脚本?

Python解析整数格式说明符的规则?

如何根据一列的值有条件地 Select 前N组?

python中的解释会在后台调用函数吗?

与命令行相比,相同的Python代码在Companyter Notebook中运行速度慢20倍

如何使用OpenGL使球体遵循Python中的八样路径?

在方法中设置属性值时,如何处理语句不可达[Unreacable]";的问题?

PYTHON、VLC、RTSP.屏幕截图不起作用

从嵌套极轴列的列表中删除元素

Python Mercury离线安装

如何使用加速广播主进程张量?

ModuleNotFoundError:Python中没有名为google的模块''

SpaCy:Regex模式在基于规则的匹配器中不起作用

将像素信息写入文件并读取该文件

如何将验证器应用于PYDANC2中的EACHY_ITEM?

使用pythonminidom过滤XML文件

组颠倒大Pandas 数据帧

Pandas:根据相邻行之间的差异过滤数据帧