当我进行切片时,发生了意外的事情,似乎第一个出现在视图中,而第二个是复制。
首先是行的切片,然后是列的切片。看来是一个看法。
>>> 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片中保留什么值?
我有(1000、256、256)形状的3D阵列。我想从x维度中删除第100-200个条目(包含1000个条目)。写入[0:100101:1001]将从第二个维度(256个项目)进行剪切。 我如何索引它?