You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Numpy中使用切片操作时什么情况下会生成新数组?

Numpy索引返回视图/拷贝的核心规则

你遇到的差异本质是Numpy对基本索引和高级索引的返回值设计不同:

  • 基本索引:仅由整数、slice对象(即start:end:step格式的切片)、省略号...、newaxis组成的索引,返回原数组的视图,视图和原数组共享数据存储空间,修改视图会同步影响原数组。
  • 高级索引:只要索引中包含整数数组/列表、布尔数组、非元组序列,就属于高级索引,返回原数组的拷贝,拷贝是独立的新数组,修改拷贝不会影响原数组。

两种链式赋值操作的差异拆解

第一种操作:a[[0,1],:][0:2,:] = [[11,12,13],[8,9,7]]

  1. 第一步执行a[[0,1],:]:索引包含整数列表[0,1],属于高级索引,返回原数组的临时拷贝,没有变量持有这个临时拷贝。
  2. 第二步执行切片赋值:修改的是上述临时拷贝,赋值完成后临时拷贝直接被回收,原数组完全没有被改动,所以打印结果和初始值一致。

第二种操作:a[0:2,:][[0,1],:] = [[11,12,13],[8,9,7]]

  1. 第一步执行a[0:2,:]:索引是slice对象0:2,属于基本索引,返回原数组前两行的视图,和原数组共享数据存储。
  2. 第二步执行高级索引赋值:修改的是视图对应的数据空间,因为视图和原数组共享数据,改动会同步回原数组,所以最终原数组的前两行被成功修改。

避坑建议

尽量不要用链式索引做赋值操作,把多步索引合并为一次索引操作,比如直接写a[[0,1],:] = [[11,12,13],[8,9,7]],就不会出现赋值不生效的问题。

内容的提问来源于stack exchange,提问作者Byihlql

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:06:05