如何强制将所有值从uint8转换为int而不是int64

时间:2018-07-19 15:58:47

标签: python numpy encryption

我有一个大小为ndarray的numpy 112 * 92。这基本上是使用cv2.imread读取的灰度图像。由于其灰度,因此其最大值为255

我正在尝试使用phe paillier库对该数组进行加密:http://python-paillier.readthedocs.io/en/stable/usage.html#role-1

但是运行public_key.encrypt()命令时出现错误:

Traceback (most recent call last):
  File "/usr/lib/python3.5/code.py", line 91, in runcode
    exec(code, self.locals)
  File "<input>", line 1, in <module>
  File "<input>", line 1, in <listcomp>
  File "/usr/local/lib/python3.5/dist-packages/phe/paillier.py", line 169, in encrypt
    encoding = EncodedNumber.encode(self, value, precision)
  File "/usr/local/lib/python3.5/dist-packages/phe/encoding.py", line 176, in encode
    % type(scalar))
TypeError: Don't know the precision of type <class 'numpy.uint8'>.

我尝试过使用floatint64,但除了最后一行的类更改外,我一直遇到相同的错误。

奇怪的是,如果我在其人工输入列表的网站上运行该示例,则该示例可以正常工作。我能理解的numpy数组和它们的示例之间的唯一区别是类型。

在检查器中签入时,其类型为int,而我的类型为uint8

secret_number_list = [3.141592653, 300, -4.6e-12]
type(secret_number_list)
<class 'list'>
type(secret_number_list[1])
<class 'int'>

如果我对数组执行相同操作,则会得到:

type(image)
<class 'numpy.ndarray'>
type(image[0][0])
<class 'numpy.uint8'>

我尝试使用int将其转换为image.astype(int),但是我得到了int64类型,它在加密时给出了相同的错误。

是否可以将所有值转换为int而不是int64

2 个答案:

答案 0 :(得分:3)

据我所知(您可以在the sources here中看到它),您应该只传递intfloat。因此,您需要将ndarray转换为包含intfloat项的嵌套列表。参见ndarray.tolist

例如:

>>> a = np.array([[1, 2], [3, 4]])
>>> b = a.tolist()
>>> type(a)
<class 'numpy.ndarray'>
>>> type(b)
<class 'list'>
>>> type(a[0][0])
<class 'numpy.int64'>
>>> type(b[0][0])
<class 'int'>

答案 1 :(得分:2)

尝试使用列表推导生成python int 的嵌套列表,然后转换回numpy数组:

import numpy
import cv2
from phe import paillier


openfilename = "/path/to/image.jpg"
img = cv2.imread(openfilename,0)

public_key, private_key = paillier.generate_paillier_keypair()

encrypted_number_list = [[public_key.encrypt(int(x)) for x in row] for row in img]
encrypted_number_array = numpy.array(encrypted_number_list)
print(encrypted_number_array)

对于大图像,这将非常慢