Nerv 배열의 python numpy 응용¶
numpy 변수가 Nerv 배열에 직접 엑세스하여 쓰는 방법입니다.¶
data = nerv.struct_SensorData_LIDAR_XYZ() # 6개의 값을 저장할수 있는 공간을 할당합니다. data.LayerAngle_alloc(6) # Raw 메모리를 (1: write , 0: read) 권한으로 가져옵니다. LayerAngle_write = data.LayerAngle_memory(1) # LayerAngle배열은 본래 float32 배열 형태입니다. # raw메모리에서 float32 타입의 행렬크기 (6)인 일차원배열로부터 numpy 변수를 얻어옵니다. LayerAngle_write_numpy = numpy.frombuffer(LayerAngle_write, dtype=numpy.float32).reshape(6, order='C') # numpy변수를 이용하여 조작합니다. # 이때 numpy변수의 데이터 버퍼는 data.LayerAngle_memory(1)로 얻어온 data변수의 raw 메모리를 가리키고 있기 때문에 # numpy변수에서 data변수로 데이터를 전달할 필요가 없습니다. LayerAngle_write_numpy[0] = 3.14; LayerAngle_write_numpy[1] = 4.14; print( "[0] = " , LayerAngle_write_numpy[0]) print( "[1] = " , LayerAngle_write_numpy[1])
원래 있던 numpy 배열을 nerv 배열에 저장하는 방법입니다.¶
# 6원 1차원 배열 numpy 변수를 만들고 값을 조작합니다. nvar = numpy.zeros( (6) ) nvar[0] = 3.14 nvar[1] = 4.14 # Nerv 변수를 선언합니다. data = nerv.struct_SensorData_LIDAR_XYZ() # 6원의 float형식의 LayerAngle 배열을 할당합니다. data.LayerAngle_alloc(6) # Raw 메모리를 (1: write , 0: read) 권한으로 가져옵니다. LayerAngle_write = data.LayerAngle_memory(1) # numpy 배열을 nerv 배열에 저장합니다. LayerAngle_write[0: numpy.float32().nbytes*6 ] = numpy.array(nvar, dtype=numpy.float32).tobytes('C')
numpy 변수가 Nerv 배열에 직접 엑세스하여 읽는 방법입니다.¶
# Read를 위한 과정은 Write와 동일합니다. # 단 쓰기만 오류 입니다. # Raw 메모리를 (1: write , 0: read) 권한으로 가져옵니다. LayerAngle_read = data.LayerAngle_memory(0) # 1: write , 0: read # LayerAngle배열은 본래 float32 배열 형태입니다. # raw메모리에서 float32 타입의 행렬크기 (6)인 일차원배열로부터 numpy 변수를 얻어옵니다. LayerAngle_read_numpy = numpy.frombuffer(LayerAngle_read, dtype=numpy.float32).reshape(6, order='C'); # 메모리를 읽기 모드로 가져왔기 때문에 쓰기는 오류입니다. # LayerAngle_read_numpy[0] = 3.14; # 오류 # LayerAngle_read_numpy[1] = 4.14; # 오류 # 저장된 값을 출력합니다. print( "[0] = " , LayerAngle_read_numpy[0]) print( "[1] = " , LayerAngle_read_numpy[1])