私は、その後、あなたは、単にバイナリとの和を掛け、2のべき乗の配列を作成することができ、符号表現からバイナリ
>>> a
array([ 1., -1., 1., -1.])
>>> (a + 1)/2
array([ 1., 0., 1., 0.])
>>>
に変換.. sig2int
から始めましょう。
>>> powers = np.arange(a.shape[-1])[::-1]
>>> np.power(2, powers)
array([8, 4, 2, 1])
>>> a = (a + 1)/2
>>> powers = np.power(2, powers)
>>> a * powers
array([ 8., 0., 2., 0.])
>>> np.sum(a * powers)
10.0
>>>
次に、軸情報を追加してブロードキャストに頼って行を操作します。
def sign2int(a):
# powers of two
powers = np.arange(a.shape[-1])[::-1]
np.power(2, powers, powers)
# sign to "binary" - add one and divide by two
np.add(a, 1, a)
np.divide(a, 2, a)
# scale by powers of two and sum
np.multiply(a, powers, a)
return np.sum(a, axis = -1)
>>> b = np.array([a, a, a, a, a])
>>> sign2int(b)
array([ 11., 11., 11., 11., 11.])
>>>
私は4 100によってビット列でそれを試してみましたが、私がそれを把握することができれば、私は逆を追加します
>>> a = a.repeat(100)
>>> b = np.array([a, a, a, a, a])
>>> b
array([[ 1., 1., 1., ..., 1., 1., 1.],
[ 1., 1., 1., ..., 1., 1., 1.],
[ 1., 1., 1., ..., 1., 1., 1.],
[ 1., 1., 1., ..., 1., 1., 1.],
[ 1., 1., 1., ..., 1., 1., 1.]])
>>> sign2int(b)
array([ 2.58224988e+120, 2.58224988e+120, 2.58224988e+120,
2.58224988e+120, 2.58224988e+120])
>>>
速いように見えました。 - 私ができる最良の方法は、単純なPythonにnumpyベクトルマジックを使わずに依存しています。私はそれを反復して一度に1つずつ変換する以外に、一連のintで動作させる方法を考えていませんでした。容認できるようです。1324年に
def foo(n):
'''yields bits in increasing powers of two
bit sequence from lsb --> msb
'''
while n > 0:
n, r = divmod(n, 2)
yield r
def int2sign(n):
n = int(n)
a = np.fromiter(foo(n), dtype = np.int8, count = n.bit_length())
np.multiply(a, 2, a)
np.subtract(a, 1, a)
return a[::-1]
作品:
>>> bin(1324)
'0b10100101100'
>>> a = int2sign(1324)
>>> a
array([ 1, -1, 1, -1, -1, 1, -1, 1, 1, -1, -1], dtype=int8)
が1.2e305で動作するようです:テストのビットの後
>>> n = int(1.2e305)
>>> n.bit_length()
1014
>>> a = int2sign(n)
>>> a.shape
(1014,)
>>> s = bin(n)
>>> s = s[2:]
>>> all(2 * int(x) -1 == y for x, y in zip(s, a))
True
>>>
* real *データセットで試しましたか?どれくらいの大きさですか? – wwii
私が見ると予想される最大のデータセットは、〜1000要素の符号配列を持ちますが、符号配列の数は数十億にものぼります---非常に高い行列です。 @wwii – user1416125
ここで言及したように、私は、符号配列に最大で64要素がある場合にのみ動作すると信じています。 @wwii – user1416125