Saya ingin membuat array numpy menggunakan struktur data numba yang ditentukan pengguna. Ketika saya memasukkan variabel dummy dalam struktur data, semuanya berfungsi dengan baik, tetapi ketika saya menghapusnya, matriks yang dihasilkan adalah pengulangan data yang saya inginkan. Tapi saya tidak tahu mengapa numpy mengulangi data saya dan bagaimana saya bisa menghindarinya.

import numpy as np
from numba.types import float64, Record, NestedArray

poly = np.random.rand (3,2)
args_dtype = Record.make_c_struct([
            ('dummy', float64),
            ('poly', NestedArray(dtype=float64, shape=poly.shape)),])

args = np.array((0,poly), dtype=args_dtype)
print(args)
print('-------------------------')
args_dtype = Record.make_c_struct([
            ('poly', NestedArray(dtype=float64, shape=poly.shape)),])

args = np.array(poly, dtype=args_dtype)
print(args)

Hasil:

(0., [[0.72543644, 0.77155485], [0.08560247, 0.11165251], [0.48421994, 0.15144579]])
-------------------------
[[([[0.72543644, 0.72543644], [0.72543644, 0.72543644], [0.72543644, 0.72543644]],)
  ([[0.77155485, 0.77155485], [0.77155485, 0.77155485], [0.77155485, 0.77155485]],)]
 [([[0.08560247, 0.08560247], [0.08560247, 0.08560247], [0.08560247, 0.08560247]],)
  ([[0.11165251, 0.11165251], [0.11165251, 0.11165251], [0.11165251, 0.11165251]],)]
 [([[0.48421994, 0.48421994], [0.48421994, 0.48421994], [0.48421994, 0.48421994]],)
  ([[0.15144579, 0.15144579], [0.15144579, 0.15144579], [0.15144579, 0.15144579]],)]]

Edit: mencetak dtype untuk kedua tahap:

{'names':['dummy','poly'], 'formats':['<f8',('<f8', (3, 2))], 'offsets':[0,8], 'itemsize':56, 'aligned':True}
-------------------------
{'names':['poly'], 'formats':[('<f8', (3, 2))], 'offsets':[0], 'itemsize':48, 'aligned':True}
0
SMA.D 11 Maret 2020, 19:03

1 menjawab

Jawaban Terbaik
In [4]: poly = np.random.rand (3,2)                                                            
In [5]: dt1 = np.dtype({'names':['dummy','poly'], 'formats':['<f8',('<f8', (3, 2))], 'offsets':
   ...: [0,8], 'itemsize':56, 'aligned':True})                                                                                        
In [6]: dt2 = np.dtype({'names':['poly'], 'formats':[('<f8', (3, 2))], 'offsets':[0], 'itemsize
   ...: ':48, 'aligned':True})                                                                 
In [7]: dt1                                                                                    
Out[7]: dtype([('dummy', '<f8'), ('poly', '<f8', (3, 2))], align=True)

Buat larik pertama:

In [8]: np.array((0,poly), dtype=dt1)                                                          
Out[8]: 
array((0., [[0.06466034, 0.43310972], [0.58102027, 0.53106307], [0.23957058, 0.26556208]]),
      dtype={'names':['dummy','poly'], 'formats':['<f8',('<f8', (3, 2))], 'offsets':[0,8], 'itemsize':56, 'aligned':True})

Tipe d kedua memiliki 1 bidang; meskipun demikian kita tetap perlu menyediakan data sebagai tuple atau daftar tuple:

In [9]: dt2                                                                                    
Out[9]: dtype([('poly', '<f8', (3, 2))], align=True)
In [10]: np.array((poly,), dt2)                                                                
Out[10]: 
array(([[0.06466034, 0.43310972], [0.58102027, 0.53106307], [0.23957058, 0.26556208]],),
      dtype={'names':['poly'], 'formats':[('<f8', (3, 2))], 'offsets':[0], 'itemsize':48, 'aligned':True})
0
hpaulj 11 Maret 2020, 16:20