当前位置: 首页 > 面试题库 >

numpy:视图与切片复制

呼延子安
2023-03-14
问题内容

当我进行切片时,发生了意外的事情,似乎第一个出现在视图中,而第二个是复制。

第一

首先是行的切片,然后是列的切片。看来是一个看法。

>>> a = np.arange(12).reshape(3, 4)   
>>> a[0:3:2, :][:, [0, 2]] = 100
>>> a
array([[100,   1, 100,   3],
       [  4,   5,   6,   7],
       [100,   9, 100,  11]])

第二

但是,如果我先是列的一部分,然后是行的一部分,那似乎是一个副本:

>>> a[:, [0, 2]][0:3:2, :] = 0
>>> a
array([[100,   1, 100,   3],
       [  4,   5,   6,   7],
       [100,   9, 100,  11]])

我很困惑,因为这两种方法最终将导致似乎位置发生变化,但是为什么第二种方法实际上并没有改变数字?


问题答案:

重要的是要按行还是按列切片。按行切片可以返回视图,因为它是原始数组的连续段。按列切片必须返回一个副本,因为它不是连续的段。例如:

A1 A2 A3
B1 B2 B3
C1 C2 C3

默认情况下,它以这种方式存储在内存中:

A1 A2 A3 B1 B2 B3 C1 C2 C3

因此,如果您想选择第二行,则为:

[A1 A2 A3] B1 B2 B3 [C1 C2 C3]

可以这样描述{start: 0, size: 3, stride: 6}

但是,如果您想选择第二列:

[A1] A2 [A3 B1] B2 [B3 C1] C2 [C3]

而且没有办法用一个开始,一个大小和一个步幅来描述它。因此,没有办法构造这样的视图。

如果您希望能够查看每隔两列而不是每隔两行,则可以按列为主(又名Fortran)顺序构造数组:

np.array(a, order='F')

然后将其存储为:

A1 B1 C1 A2 B2 C2 A3 B3 C3


 类似资料:
  • Python 的内置容器对象,例如列表,可以通过索引或切片来访问和修改。这在 ndarray 对象中也一样,ndarray 对象中的元素遵循基于零的索引,常用的索引方式:元素访问、切片索引、布尔型索引。 1. 元素访问 1.1 单一元素访问 一维数组的元素访问非常简单,和 Python 列表规则基本差不多。对单一元素的访问,索引遵循从 0 开始,依次递增 1。 案例 例如,对于创建的一维数组,我们

  • 视图是指对数据的引用,通过该引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。 视图一般发生在: Numpy 的切片操作返回原数据的视图; 调用 ndarray 的 view() 函数产生一个视图。 副本一般发生在: 在对 Pytho

  • 主要内容:基本切片,多维数组切片在 NumPy 中,如果想要访问,或修改数组中的元素,您可以采用索引或切片的方式,比如使用从 0 开始的索引依次访问数组中的元素,这与 Python 的 list 列表是相同的。 NumPy 提供了多种类型的索引方式,常用方式有两种:基本切片与高级索引。本节重点讲解基本切片。 基本切片 NumPy 内置函数 slice() 可以用来构造切片对象,该函数需要传递三个参数值分别是 start(起始索引

  • 如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 copy 函数和向切片追加新元素的 append 函数。 示例 7.12 copy_append_slice.go package main import "fmt" func main() { sl_from := []int{1, 2, 3} sl_to := mak

  • 我是一个编程新手。我在go编程书中读到过,片由三部分组成:指向数组的指针、长度和容量。 我感到困惑的零切片(切片没有底层数组指向,len=0,cap=0),非零切片只有len=0,cap=0和空切片。 谁能告诉我零和空切片是否是一回事?如果它们都不同,那么请告诉这两者之间的区别是什么? 如何测试一个切片是否为空? 另外,指针在长度和容量为零的非nil片中保留什么值?

  • 本文向大家介绍浅析NumPy 切片和索引,包括了浅析NumPy 切片和索引的使用技巧和注意事项,需要的朋友参考一下 ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。 ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新