Tricks(七)——list of lists 行和、列和的计算

本文介绍如何在Python中不使用高级库的情况下,利用list of lists实现邻接矩阵的表示,并计算图中每个节点的出度和入度。通过简单的循环和列表推导式实现了高效计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道如果以邻接矩阵的形式(元素为0/1、true/false,只表示关联与否)表示图结构的话,邻接矩阵的行和表示每一个顶点的出度,邻接矩阵的列和表示每一个顶点的入度。

如果不使用高级的 python 第三方的库(如 numpy),而仅使用 list,使用 list of lists 来表示邻接矩阵,该如何计算行和、列和(也即出度、入度)呢?

from random import randrange
n = 10
N = [[randrange(2) for _ in range(n)] for _ in range(n)]
                                        # 随机 0-1 值构成的随机图
out_degrees = [0]*n
in_degrees = [0]*10

for i in range(n):
    out_degrees[i] = sum(N[i])

for j in range(n):
    for i in range(n):
        in_degrees[j] += N[i][j]
                                    # 注意入度的循环顺序,
                                    # 固定列,遍历行                           

补充

充分发挥 Python 的语法特性,也即 list comprehension,这里提供一个更为简便的版本:

out_degrees = [sum(N[i]) for i in range(n)]
in_degrees = [sum([N[i][j] for i in range(n)]) for j in range(n)]
<think>好的,我现在需要回答用户关于NumPy是否有能够同时按分割数组的函数的问题。首先,我得回忆一下NumPy中常用的数组分割函数,比如`hsplit`、`vsplit`、`split`等。已知这些函数通常只能沿着一个轴进分割,比如或者单独操作。 用户的问题是关于同时按一起分割,这可能指的是将二维数组分成更小的二维块,比如将一个4x4的数组分成四个2x2的子数组。这时候,我想到`reshape``split`结合使用可能可以实现,但不确定是否有更直接的函数。 然后,我想到NumPy的`array_split`函数,虽然它允许指定轴,但同样只能沿一个轴分割。或许需要组合使用多个分割步骤。例如,先按分割,再对每个子数组按分割。但这样可能需要循环操作,效率可能不高。 突然想到,`np.split`可以结合轴参数,但需要分步骤处理。或者,是否可以使用`reshape`交换轴来达到目的?例如,先将数组重新排成块,再分割。不过这可能对数组的形状有特定要求,比如必须能均匀分割。 另外,是否存在一个函数能够同时指定的分割点?例如,类似于`block`函数,但反过来分割。查阅资料发现,`np.block`是用于将小块组合成大数组,而分割的话可能需要使用`split`多次。 可能正确的做法是:先按分割,然后在每个块中按分割。例如,对于一个数组`arr`,先使用`np.split(arr, row_indices, axis=0)`得到分割后的表,再对每个子数组应用`np.split(..., column_indices, axis=1)`。这样就能得到按同时分割的结果,形成二维块。 不过这样处理需要嵌套循环或表推导式,可能不够简洁。有没有更直接的方法?例如使用`np.lib.stride_tricks.sliding_window_view`或者`reshape`加上多个维度分割。比如,如果数组的形状是(M, N),想要分成(m, n)大小的块,可以调整形状,前提是MN能被mn整除。例如,`arr.reshape(M//m, m, N//n, n).transpose(0,2,1,3)`,这样每个块可以按前两个维度索引。 这时候,可能需要给出一个例子,说明如何通过reshapetranspose来实现。例如,将一个4x4数组分成2x2的块,得到4个2x2的子数组。这种方法适用于均匀分割的情况,如果是非均匀的,可能还是需要结合split函数多次使用。 总结:NumPy没有直接同时按分割的单一函数,但可以通过组合使用split或reshape等方法实现。需要根据具体情况选择合适的方法,比如是否均匀分割,是否需要处理边界情况等。此外,可能推荐使用`skimage.util.view_as_blocks`函数,如果用户不介意使用scikit-image库的话,但这个可能超出NumPy本身的范围。</think>NumPy本身没有直接按**同时分割**的单一函数,但可以通过组合现有函数实现类似效果。以下是两种常见方法: --- ### **方法1:分步切割(适合任意分割)** 1. **先按分割**:使用`np.split(arr, row_indices, axis=0)` 2. **再按分割**:对每个块继续使用`np.split(block, col_indices, axis=1)` ```python import numpy as np arr = np.arange(16).reshape(4, 4) # 示例数组 row_split = [2] # 在第2后切割 col_split = [2] # 在第2后切割 # 按分割 row_blocks = np.split(arr, row_split, axis=0) # 按分割每个块 result = [np.split(block, col_split, axis=1) for block in row_blocks] # 结果是一个二维表:result[i][j] 对应第i块、第j块的子数组 ``` --- ### **方法2:reshape + transpose(仅限均匀分割)** 若需将数组均匀分割为$m \times n$的小块(如将$4 \times 4$分成$2 \times 2$的块),可用以下操作: ```python m, n = 2, 2 # 每个小块的数 blocks = arr.reshape(arr.shape[0]//m, m, arr.shape[1]//n, n) blocks = blocks.transpose(0, 2, 1, 3) # 调整维度顺序 # 此时 blocks[i][j] 对应第i、第j的小块 ``` --- ### **扩展建议** - **非均匀分割**:优先使用方法1的分步切割。 - **图像处理库**:若允许额外依赖,`skimage.util.view_as_blocks`(来自scikit-image)可直接生成均匀块: ```python from skimage.util import view_as_blocks blocks = view_as_blocks(arr, (m, n)) ``` --- **总结**:NumPy需组合函数实现同时分割,根据需求选择分步切割或均匀块变形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值