python多维列表索引的常见问题

发布时间 2023-03-28 20:45:06作者: 寒冰可乐

这点颇为让人头疼,最主要的问题是一些其他的常见库,比如numpy的数组,它添加了一些python原版列表没有的用法,然而我们经常忘了原版列表其实是没有这些用法的,导致程序错误。

numpy可以把取所有维度的操作放到一个方括号里,然而python原版list不行:

# numpy数组
import numpy as np
a = np.random.randn(3,4)
print(a)
# [[ 1.4535828   0.26964621 -0.48345505 -0.12031992]
#  [ 0.61212023  0.88284351  0.65025632 -0.23002265]
#  [ 0.8213387   0.6867936   0.00451447 -0.94561089]]
print(a[1,1])    # 0.8828435074881348
print(a[:,1])    # [0.26964621 0.88284351 0.6867936 ]
print(a[2])        # [ 0.8213387   0.6867936   0.00451447 -0.94561089]

# python原版列表
b = a.tolist()
print(b)
# [[1.4535828000665305, 0.26964620951449286, -0.4834550466536358, -0.12031991559977556],
#  [0.6121202339096959, 0.8828435074881348, 0.6502563210389117, -0.23002264849652684],
#  [0.8213387007918898, 0.6867936010249093, 0.00451446729164186, -0.9456108902605519]]
print(b[1][1])    # 0.8828435074881348
print(b[1][:])    # [0.6121202339096959, 0.8828435074881348, 0.6502563210389117, -0.23002264849652684]
print(b[:][1])    # [0.6121202339096959, 0.8828435074881348, 0.6502563210389117, -0.23002264849652684]
print(b[2])        # [0.8213387007918898, 0.6867936010249093, 0.00451446729164186, -0.9456108902605519]

首先我们可以看出原版list显示的数据长度比numpy更长

原版list不能出现a[1,1]这种写法,只能写成b[1][1]这样

其次是原版list必须在前面的维度指定数字,比如b[1][:],就是取第一行,而原版list不能直接取一列,你写b[:][1]输出的结果还是第一行,而不是第一列。