Python数组连接疑问:区分求和与连接操作及相关问题
问题解答
1. xs的形状是什么?
首先要明确:np.split(x,5)返回的不是一个numpy数组,而是一个Python列表,里面包含了5个一维numpy数组。所以你不能直接用xs.shape来获取它的"形状"——因为列表本身没有shape属性。
我们可以拆解来看:
- 列表里的每个子元素都是
np.ndarray类型,它们的形状都是(2,)(一维数组,长度为2) - 整个
xs是一个长度为5的Python列表,元素就是上述的5个一维数组
你可以用代码验证这一点:
import numpy as np x = np.arange(10) x[4]=44 xs=np.split(x,5) # 查看xs的类型 print(type(xs)) # 输出 <class 'list'> # 查看每个子数组的形状 for arr in xs: print(arr.shape) # 每个子数组都会输出 (2,)
2. 为什么xs[:i]+xs[i+1:]没有执行求和操作?
这里的核心是区分Python列表的+运算符和numpy数组的+运算符:
xs是Python列表,xs[:i]是取列表的前i个元素(这里i=2,结果是[array([0,1]), array([2,3])]),xs[i+1:]是取列表从i+1位置开始的剩余元素(结果是[array([6,7]), array([8,9])])- Python列表的
+运算符作用是拼接两个列表,而不是对列表中的元素做加法。所以xs[:i]+xs[i+1:]的结果是一个新的列表:[array([0,1]), array([2,3]), array([6,7]), array([8,9])] - 最后
np.concatenate会把这个新列表里的所有一维数组连接成一个大的一维数组,也就是你看到的array([0, 1, 2, 3, 6, 7, 8, 9])
如果想要实现数组元素的求和,你需要先把xs转换成二维numpy数组,再使用numpy的元素级加法逻辑。举个例子:
# 把xs转换成二维numpy数组 xs_arr = np.array(xs) # 此时xs_arr的形状是(5,2) i=2 # 筛选掉第i行后,对剩余行做对应位置的求和 sum_arr = np.sum(xs_arr[np.arange(len(xs_arr)) != i], axis=0) print(sum_arr) # 输出 array([16, 20]),对应0+2+6+8和1+3+7+9的结果
简单总结:
- 操作对象是Python列表时,
+是列表拼接 - 操作对象是numpy数组时,
+是元素级的对应位置相加
内容的提问来源于stack exchange,提问作者user3452134
相关产品推荐
相关产品推荐

