Аргументы функции numpy int64 ()?

Не уверен, почему я не могу найти это, но что означает следующее?

hashvalue_byte_size = len(bytes(np.int64(42).data))

Обращаясь слева направо, я бы сказал, что это описывает длину байтов в np.int64 (42) .data.

Таким образом, длина байта равна 8.

Я думаю, что np.int64 () означает целое число в (от -9223372036854775808 до 9223372036854775807) или целое число без знака в (от 0 до 18446744073709551615)

Или префикс np делает int64 () чем-то еще?

Наконец, что означает «42»? Что означает .data?


person spacedustpi    schedule 14.11.2018    source источник
comment
См. здесь для различий между встроенными целыми и numpy целыми числами.   -  person onepint16oz    schedule 14.11.2018


Ответы (2)


Имеет смысл проанализировать подобное выражение изнутри:

In [189]: np.int64(42)
Out[189]: 42
In [190]: type(_)
Out[190]: numpy.int64
In [191]: np.int64(42).data
Out[191]: <memory at 0x7f7dc41a82e8>
In [192]: type(_)
Out[192]: memoryview
In [193]: np.int64(42)
Out[193]: 42
In [194]: type(_)
Out[194]: numpy.int64
In [195]: np.int64(42).data
Out[195]: <memory at 0x7f7dcc05cac8>
In [196]: type(_)
Out[196]: memoryview
In [197]: bytes(np.int64(42).data)
Out[197]: b'*\x00\x00\x00\x00\x00\x00\x00'
In [198]: len(_)
Out[198]: 8

Возможно, имеет смысл взглянуть на массив numpy с одним или несколькими элементами:

In [204]: np.array(42)
Out[204]: array(42)
In [205]: _.dtype
Out[205]: dtype('int64')
In [206]: np.array(42).data
Out[206]: <memory at 0x7f7dcc054780>
In [207]: bytes(np.array(42).data)
Out[207]: b'*\x00\x00\x00\x00\x00\x00\x00'
In [208]: bytes(np.array([42,43]).data)
Out[208]: b'*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00'

Объект массива имеет атрибуты и databuffer. Этот буфер хранит данные, в данном случае как 8-байтовое целое число для каждого элемента. bytes(...data) просто создает представление этого буфера в виде строки байтов.

То же самое и с методом tobytes:

In [209]: np.array([42,43]).tobytes()
Out[209]: b'*\x00\x00\x00\x00\x00\x00\x00+\x00\x00\x00\x00\x00\x00\x00'
person hpaulj    schedule 14.11.2018

Когда вы пытаетесь расшифровать подобные выражения, вы должны идти не слева направо, а изнутри наружу. Как вы можете видеть ниже, первые два оператора определяют объект numpy.int64, который принимает значение 42. Это означает, что 42 сохраняется в памяти как 64-битное целое число. Следующий вызов дает вам адрес памяти вашего объекта. Сразу после этого, я думаю, вы получите содержание адреса вашей памяти, выраженное на языке, которого я не знаю. И последний просто дает вам количество байтов, которые выделяются по адресу памяти. Здесь 8, поскольку вы выделили место для 64-битного целого числа (1 байт = 8 бит).

import numpy

print(numpy.int64(42))
# 42
print(type(numpy.int64(42)))
# <class 'numpy.int64'>
print(numpy.int64(42).data)
# <memory at 0x7f5e43221588>
print(bytes(numpy.int64(42).data))
# b'*\x00\x00\x00\x00\x00\x00\x00'
print(len(bytes(numpy.int64(42).data)))
# 8
person Patol75    schedule 14.11.2018