numpy : 단일 유형의 ndarray를 structured array로 변환하고 싶습니다.
이것은 무엇인가
단일의 형태로 정의된 통상의 ndarray 를 structured array 로 변환하는 방법입니다.
동기
방법 1 : 튜플 목록을 통해
Numpy : Structured array : Assignment from Python Native Types (Tuples) .
코드 예
import numpy
# d1, d2, d3 の 3 つのデータがあるとします
d1 = numpy.arange(0, 1000, dtype='int32')
d2 = numpy.arange(1000, 2000, dtype='int32')
d3 = numpy.arange(2000, 3000, dtype='int32')
# くっつけます
d = numpy.array([d1, d2, d3]).T
# d はこんな感じです
# array([[ 0, 1000, 2000],
# [ 1, 1001, 2001],
# [ 2, 1002, 2002],
# ...,
# [ 997, 1997, 2997],
# [ 998, 1998, 2998],
# [ 999, 1999, 2999]], dtype=int32)
# dtype を定義しときます
dtype1 = [
('d1', 'int32'),
('d2', 'int32'),
('d3', 'int32'),
]
# structured array に変換します
sa1 = numpy.array(list(map(tuple, d)), dtype=dtype1)
# sa1 はこんな感じ
# array([( 0, 1000, 2000), ( 1, 1001, 2001), ( 2, 1002, 2002),
# ( 3, 1003, 2003), ( 4, 1004, 2004), ( 5, 1005, 2005),
# ( 6, 1006, 2006), ( 7, 1007, 2007), ( 8, 1008, 2008),
# ...
# (993, 1993, 2993), (994, 1994, 2994), (995, 1995, 2995),
# (996, 1996, 2996), (997, 1997, 2997), (998, 1998, 2998),
# (999, 1999, 2999)],
# dtype=[('d1', '<i4'), ('d2', '<i4'), ('d3', '<i4')])
# 個別のデータに key でアクセスできるようになりました
sa1['d1']
# array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
# 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,
# ...
# 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987,
# 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999],
# dtype=int32)
공연
%time numpy.array(list(map(tuple, d)), dtype=dtype1)
# CPU times: user 2.63 ms, sys: 0 ns, total: 2.63 ms
# Wall time: 2.64 ms
방법 2 : 버퍼를 통한
ndarray 메모리의 데이터를 tobytes ()로 검색하고 frombuffer ()로 재해석하면 빠르지 않을 것입니다.
코드 예
import numpy
# data を作ります
d1 = numpy.arange(0, 1000, dtype='int32')
d2 = numpy.arange(1000, 2000, dtype='int32')
d3 = numpy.arange(2000, 3000, dtype='int32')
d = numpy.array([d1, d2, d3]).T
# dtype を定義します
dtype1 = [
('d1', 'int32'),
('d2', 'int32'),
('d3', 'int32'),
]
### ここまでは、方法 1 と同じです ###
# structured array に変換します
sa2 = numpy.frombuffer(d.tobytes(), dtype=dtype1)
# sa1 と sa2 の値は全く同じです
all(sa2 == sa1)
# >> True
공연
%time numpy.frombuffer(d.tobytes(), dtype=dtype1)
# CPU times: user 75 µs, sys: 0 ns, total: 75 µs
# Wall time: 83.9 µs
조금 더 비교
코드
import numpy
import time
dtype1 = [
('d1', 'int32'),
('d2', 'int32'),
('d3', 'int32'),
]
def run(num, func):
d = numpy.arange(num*3, dtype='int32').reshape((3, num)).T
t0 = time.time()
[func(d) for i in range(100)]
t1 = time.time()
return (t1 - t0) / 100
func1 = lambda x: numpy.array(list(map(tuple, x)), dtype=dtype1)
func2 = lambda x: numpy.frombuffer(x.tobytes(), dtype=dtype1)
# 計測します
nums = numpy.logspace(2, 5, 10, dtype=int)
t1 = [run(i, func1) for i in nums]
t2 = [run(i, func2) for i in nums]
# プロットします
import matplotlib.pyplot
fig = matplotlib.pyplot.figure()
ax = fig.add_subplot(111, aspect=1)
ax.plot(nums, t1, 'o-', label='tuple')
ax.plot(nums, t2, 'o-', label='bytes')
ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xlabel('# of data points')
ax.set_ylabel('Calculation time [s]')
ax.grid(True, color='#555555')
ax.grid(True, which='minor', linestyle=':', color='#aaaaaa')
ax.legend()
fig.savefig('results.png', dpi=200)
Reference
이 문제에 관하여(numpy : 단일 유형의 ndarray를 structured array로 변환하고 싶습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nishimuraatsushi/items/5591a44db7f34aebbf8e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)