- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个数组
arr = array([ 9.93418544e+00, 1.17237323e+01, 1.34554537e+01,
2.43598467e+01, 2.72818286e+01, 3.11868750e+01,...])
当执行以下命令时,我得到一些输出:
arr.itemsize # 8
type(arr[0]) # numpy.float64
sys.getsizeof(np.float64()) # 32
sys.getsizeof(arr[0]) # 32
arr.dtype # dtype('float64')
itemsize 似乎无法正常工作。我很感兴趣为什么会发生这种情况?
我与
一起工作print(sys.version)
3.5.5 | packaged by conda-forge | (default, Jul 24 2018, 01:52:17) [MSC v.1900 64 bit (AMD64)]
numpy==1.10.4
最佳答案
It seems that itemsize doesn't work properly.
确实如此,不同的结果是由于 Python 对象与 numpy 中的项目不同而导致的。
在Python中,一切都是对象。数据被“装箱”。这意味着,例如对于 int
,我们得到:
>>> sys.getsizeof(2)
28
即 28 个字节。那是很多。在大多数编程语言中,int
占用 2 到 8 个字节。如果是 32 位 int
,则需要 4 个字节。
但在Python中,一个对象有很多“上下文”。例如一些字节用来表示对象的类型等。
但是 Numpy 不是在 Python 中实现的,它不是一个使用 Python 对象本身的库。它更像是一个用 C 实现的库,并且具有良好的 Python 接口(interface)。因此,这意味着列表 [1, 4, 2, 5]
在 Python 中不是存储为具有四个对 int
对象的引用的列表,而是存储为数组,通常与“未装箱”的元素。因此,考虑到 int
每个 32 位、4*32 位以及数组周围“上下文”的一些额外空间,上述内容将采用。
因此,元素可以以更节省空间的方式存储。这使得处理值变得更容易,因为我们在这里不跟随指针,而是直接跟随值(有一些方法可以将引用存储在 numpy 数组中,但现在让我们忽略它)。此外,到目前为止,numpy 数组占用的内存比等效的 Python 列表(连同它所包含的项目)要少。
但是,如果您从 numpy 数组中获取一项,则需要为此创建一个 Python 对象。因此,这意味着这里它将构造一个 numpy.float64 对象,其中包含该值,但又包含该值周围的大量“上下文”。这会导致使用更多内存。
numpy 构造特定类型对象的数组这一事实也会产生一些后果。例如,如果您使用 numpy.int16
,则意味着无法将大于 32767 的值存储到其中,因为该值无法用 16 位 2-complement 表示形式表示:
>>> np.int16(32767)
32767
>>> np.int16(32768)
-32768
此外,如果不使用 Python 对象引用或其他一些“技巧”,就无法构造一个包含不同类型对象的数组。例如,Numpy 构造一个 int16
数组,这意味着它将 160 位解释为 10 个 16 位数字。在Python中,列表本身包含对对象的引用,并且Python对象知道它是什么类型,因此这意味着我们可以设置对另一种类型的另一个对象的引用。
关于python - np.array arr.itemsize 与 sys.getsizeof(arr[0]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141990/
这个问题在这里已经有了答案: Unexpected result with `in` operator chaining (1 个回答) Chaining "is" operators (4 个回答)
我想知道为什么下面的代码会崩溃。 int main( ) { int arr = 1 && arr; return 0; } 但不是下面的代码 int main( ) {
什么是计算一组数字平均值的更准确方法,ARR[0]/N+ARR[1]/N...+ARR[N-1]/N 或 (ARR[0]+ARR[1]...+ARR[N-1])/N? (ARR 是一组数字,N 是该组
#include using namespace std; int main() { int arr[5] = {5, 8, 1, 3, 6}; int len = *(&arr +
在下面的代码中,是什么意思 vector avector (arr, arr + sizeof(arr) / sizeof(arr[0]) ); 在 main() 中? vector bubbleSo
我主要是这样使用的: arr.push(element) 但我见过有人这样使用: arr.push.apply(arr, element) 这两种方法有什么区别? 最佳答案 我认为在使用“列表”时更常
任务是重新排列一个数组,使 arr[i] 变成 arr[arr[i]],复杂度为 O(1)额外的空间。 例子: 2 1 3 5 4 0 变成: 3 1 5 0 4 2 我可以想到一个O(n²) 的解决
今天我来了一篇 Eric Lippert 的文章他试图澄清运算符优先级和评估顺序之间的迷思。最后有两个代码片段让我感到困惑,这是第一个片段: int[] arr = {0};
view和copy的意思是不同的,如果你有一个view,那么如果你改变1另一个也应该改变,如果你有一个副本那么改变1应该不会影响另一个 有 3 种制作 view 的方法/copy数组的 arr_2 =
这个问题在这里已经有了答案: How does *(&arr + 1) - arr give the length in elements of array arr? (3 个回答) Why are
我想将自己的值输入到 20 个大数组中,并将其复制到 2 个 10 个小数组中,然后必须打印第二个数组的值。我收到错误 ArrayIndexOutOfBoundsException 我的代码有什么问题
我是 C++ 新手。我正在尝试实现一个堆栈。我声明 arr默认构造函数中的命名变量。 但是当我编译我的代码时,我收到一条错误消息 'arr' was not declared in this scop
这个问题已经有答案了: Pointers - Difference between Array and Pointer (2 个回答) 已关闭 6 年前。 (C语言)之间有什么区别 int * a i
这个问题已经有答案了: How come an array's address is equal to its value in C? (6 个回答) 已关闭 4 年前。 这两个打印有什么区别,我在两
是一样的 char* s1[size]; 到 char** s2 = malloc(size * sizeof(char*)); 它们有什么区别吗? 最佳答案 理论上,*arr[]和**arr是不同的
我有一个字符串数组 arr[5][8] = {...} (声明了每个字符串),我试图了解 arr[3 的值是什么] - arr[2] 是什么以及它的类型是什么。我无法理解为什么地址之间的差异以字节为单
var arr = [foo,bar,xyz]; arr[arr.indexOf('bar')] = true; 在 JS 中有更简单的方法吗? 最佳答案 你可以只使用对象。 var obj = {f
这个问题在这里已经有了答案: What is the difference when we use array names instead of spread operator? (3 个答案) 关
在修改屏蔽数组中的数据时,我没想到会出现以下行为。似乎可以使用 [] 操作数修改某些值,但不是全部。但是,如果您访问它的数据属性,那么您可以修改所有内容。仅当元组中某个单元格的掩码中存在 True 值
我不明白如何确定以下元素: *(arr+1)[1] - 7 被打印出来。 **(arr+1) - 打印 4。 #include int main() { int arr[3][3]={1,2
我是一名优秀的程序员,十分优秀!