ë²í¼ íë¡í ì½Â¶
íì´ì¬ìì ì¬ì©í ì ìë ì´ë¤ ê°ì²´ë íë¶ ë©ëª¨ë¦¬ ë°°ì´ ëë ë²í¼ì ëí ì¡ì¸ì¤ë¥¼ ê°ìëë¤. ì´ë¬í ê°ì²´ìë ë´ì¥ bytes ì bytearray, ê·¸ë¦¬ê³ array.arrayì ê°ì ì¼ë¶ íì¥íì´ í¬í¨ë©ëë¤. ì ì¼ì ë¼ì´ë¸ë¬ë¦¬ë ì´ë¯¸ì§ ì²ë¦¬ë ìì¹ í´ìê³¼ ê°ì í¹ìí ì©ëë¡ ìì²´ íì ì ìí ì ììµëë¤.
ì´ë¬í íì ê°ê° ê³ ì ì ìë¯¸ê° ìì§ë§, (ìë§ë) í° ë©ëª¨ë¦¬ ë²í¼ì ìí´ ë·ë°ì¹¨ëë ê³µíµë í¹ì§ì ê³µì í©ëë¤. ì´ë¤ ìí©ììë ì¤ê° ë³µì¬ ìì´ ì§ì ë²í¼ì ì¡ì¸ì¤íë ê²ì´ ë°ëì§í©ëë¤.
Python provides such a facility at the C and Python level in the form of the buffer protocol. This protocol has two sides:
on the producer side, a type can export a âbuffer interfaceâ which allows objects of that type to expose information about their underlying buffer. This interface is described in the section ë²í¼ ê°ì²´ 구조체; for Python see Emulating buffer types.
on the consumer side, several means are available to obtain a pointer to the raw underlying data of an object (for example a method parameter). For Python see
memoryview.
bytes ì bytearrayì ê°ì ê°ë¨í ê°ì²´ë íë¶ ë²í¼ë¥¼ ë°ì´í¸ ì§í¥ íìì¼ë¡ ë
¸ì¶í©ëë¤. ë¤ë¥¸ ííë ê°ë¥í©ëë¤; ì를 ë¤ì´, array.arrayì ìí´ ë
¸ì¶ëë ììë ë©í° ë°ì´í¸ ê°ì´ ë ì ììµëë¤.
ë²í¼ ì¸í°íì´ì¤ì ìë¹ì ìë íì¼ ê°ì²´ì write() ë©ìëì
ëë¤: ë²í¼ ì¸í°íì´ì¤ë¥¼ íµí´ ì¼ë ¨ì ë°ì´í¸ë¥¼ ë´ë³´ë¼ ì ìë 모ë ê°ì²´ë íì¼ì 기ë¡ë ì ììµëë¤. write()ê° ì ë¬ë ê°ì²´ì ë´ë¶ ë´ì©ì ëí ì½ê¸° ì ì© ì¡ì¸ì¤ë§ íìíì§ë§, readinto()ì ê°ì ë¤ë¥¸ ë©ìëë ì¸ìì ë´ì©ì ì°ê¸° ì¡ì¸ì¤ê° íìí©ëë¤. ë²í¼ ì¸í°íì´ì¤ë ê°ì²´ê° ì½ê¸°-ì°ê¸°ì ì½ê¸° ì ì© ë²í¼ë¥¼ ì íì ì¼ë¡ íì©íê±°ë ê±°ë¶í ì ìëë¡ í©ëë¤.
ë²í¼ ì¸í°íì´ì¤ì ìë¹ìê° ëì ê°ì²´ì ëí´ ë²í¼ë¥¼ ì»ë ë°©ë²ìë ë ê°ì§ê° ììµëë¤:
ì¬ë°ë¥¸ ë§¤ê° ë³ìë¡
PyObject_GetBuffer()를 í¸ì¶í©ëë¤;y*,w*ëës*íì ì½ë ì¤ íë를 ì¬ì©íì¬PyArg_ParseTuple()(ëë ê·¸ íì ì¤ íë)ì í¸ì¶í©ëë¤.
ë ê²½ì° ëª¨ë, ë²í¼ê° ëë íìíì§ ìì¼ë©´ PyBuffer_Release()를 í¸ì¶í´ì¼ í©ëë¤. ê·¸ë ê² íì§ ìì¼ë©´ ìì ëìì ê°ì ë¤ìí 문ì ê° ë°ìí ì ììµëë¤.
Added in version 3.12: The buffer protocol is now accessible in Python, see
Emulating buffer types and memoryview.
ë²í¼ 구조체¶
ë²í¼ 구조체(ëë ë¨ìí âë²í¼â)ë ë¤ë¥¸ ê°ì²´ì ë°ì´ë리 ë°ì´í°ë¥¼ íì´ì¬ íë¡ê·¸ë머ìê² ë ¸ì¶íë ë°©ë²ì¼ë¡ ì ì©í©ëë¤. ëí, ë³µì¬ ìë(zero-copy) ì¬ë¼ì´ì± ë©ì»¤ëì¦ì¼ë¡ ì¬ì©í ì ììµëë¤. ë©ëª¨ë¦¬ ë¸ë¡ì 참조íë ë¥ë ¥ì ì¬ì©í´ì, ììì ë°ì´í°ë¥¼ íì´ì¬ íë¡ê·¸ë머ìê² ì주 ì½ê² ë ¸ì¶í ì ììµëë¤. ë©ëª¨ë¦¬ë C íì¥ì í° ìì ë°°ì´ì¼ ì ìì¼ë©°, ì´ì ì²´ì ë¼ì´ë¸ë¬ë¦¬ë¡ ì ë¬ë기 ì ì ì¡°ìí기 ìí ìì ë©ëª¨ë¦¬ ë¸ë¡ì¼ ìë ìê³ , ë¤ì´í°ë¸ ì¸ ë©ëª¨ë¦¬(in-memory) íìì¼ë¡ 구조íë ë°ì´í°ë¥¼ ì ë¬íë ë° ì¬ì©ë ìë ììµëë¤.
íì´ì¬ ì¸í°í리í°ê° ë
¸ì¶íë ëë¶ë¶ì ë°ì´í°íê³¼ ë¬ë¦¬, ë²í¼ë PyObject í¬ì¸í°ê° ìëë¼ ë¨ìí C 구조체ì
ëë¤. ì´ë¥¼ íµí´ ë§¤ì° ê°ë¨íê² ë§ë¤ê³ ë³µì¬í ì ììµëë¤. ë²í¼ë¥¼ ê°ì¸ë ì¼ë° ëí¼ê° íìí ëë, ë©ëª¨ë¦¬ ë·° ê°ì²´ë¥¼ ë§ë¤ ì ììµëë¤.
ì ê³µíë(exporting) ê°ì²´ë¥¼ ìì±íë ê°ë¨í ì§ì¹¨ì ë²í¼ ê°ì²´ 구조체를 참조íììì¤. ë²í¼ë¥¼ ì»ì¼ë ¤ë©´, PyObject_GetBuffer()를 참조íììì¤.
-
type Py_buffer¶
- Part of the ìì ABI (including all members) ë²ì 3.11 ì´íë¡.
-
void *buf¶
ë²í¼ íëì ìí´ ê¸°ì ë ë ¼ë¦¬ì 구조ì ììì ê°ë¦¬í¤ë í¬ì¸í°. ì´ê²ì ì ê³µì(exporter)ì íë¶ ë¬¼ë¦¬ì ë©ëª¨ë¦¬ ë¸ë¡ ë´ì 모ë ìì¹ì¼ ì ììµëë¤. ì를 ë¤ì´, ìì
strides를 ì¬ì©íë©´ ê°ì´ ë©ëª¨ë¦¬ ë¸ë¡ì ëì ê°ë¦¬í¬ ì ììµëë¤.ì°ì ë°°ì´ì ê²½ì°, ê°ì ë©ëª¨ë¦¬ ë¸ë¡ì ììì ê°ë¦¬íµëë¤.
-
PyObject *obj¶
ì ê³µíë(exporting) ê°ì²´ì ëí ì 참조. 참조ë ìë¹ìê° ìì íê³ ,
PyBuffer_Release()ì ìí´ ìëì¼ë¡ í´ì ëê³ (ì¦ ì°¸ì¡° íìê° ê°ìí©ëë¤)NULLë¡ ì¤ì ë©ëë¤. ì´ íëë íì¤ C-API í¨ìì ë°í ê°ê³¼ ëë±í©ëë¤.í¹ìí ê²½ì°ë¡,
PyMemoryView_FromBuffer()ëPyBuffer_FillInfo()ë¡ ê°ì¸ì§ ìì(temporary) ë²í¼ì ê²½ì°, ì´ íëëNULLì ëë¤. ì¼ë°ì ì¼ë¡, ì ê³µíë(exporting) ê°ì²´ë ì´ ì²´ê³ë¥¼ ì¬ì©íì§ ììì¼ í©ëë¤.
-
Py_ssize_t len¶
product(shape) * itemsize. ì°ì ë°°ì´ì ê²½ì°, íë¶ ë©ëª¨ë¦¬ ë¸ë¡ì 길ì´ì ëë¤. ë¶ì°ì ë°°ì´ì ê²½ì°, ì°ì ííì¼ë¡ ë³µì¬ëë¤ë©´ ë ¼ë¦¬ì êµ¬ì¡°ì²´ê° ê°ê² ë 길ì´ì ëë¤.((char *)buf)[0] ìì ((char *)buf)[len-1]ë²ìì ì¡ì¸ì¤ë ì°ìì±ì ë³´ì¥íë ìì²ì¼ë¡ ë²í¼ê° íë³´ë ê²½ì°ìë§ ì í¨í©ëë¤. ëë¶ë¶ ì´ë¬í ìì²ìPyBUF_SIMPLEëëPyBUF_WRITABLEì ëë¤.
-
int readonly¶
ë²í¼ê° ì½ê¸° ì ì©ì¸ì§ë¥¼ ëíë´ë íì기ì ëë¤. ì´ íëë
PyBUF_WRITABLEíëê·¸ë¡ ì ì´ë©ëë¤.
-
Py_ssize_t itemsize¶
ë¨ì¼ ììì í목 í¬ê¸°(ë°ì´í¸)ì ëë¤.
NULLì´ ìëformatê°ì í¸ì¶ëstruct.calcsize()ê°ê³¼ ê°ìµëë¤.ì¤ìí ìì¸: ìë¹ìê°
PyBUF_FORMATíëê·¸ ìì´ ë²í¼ë¥¼ ìì²íë©´,formatìNULLë¡ ì¤ì ëì§ë§,itemsizeë ì¬ì í ìë íìì ê°ì ê°ìµëë¤.shapeì´ ìì¼ë©´,product(shape) * itemsize == lenëì¹ê° ê³ì ì±ë¦½íê³ ìë¹ìëitemsize를 ì¬ì©íì¬ ë²í¼ë¥¼ íìí ì ììµëë¤.PyBUF_SIMPLEì´ëPyBUF_WRITABLEìì²ì ê²°ê³¼ë¡shapeì´NULLì´ë©´, ìë¹ìëitemsize를 무ìíê³itemsize == 1ë¡ ê°ì í´ì¼ í©ëë¤.
-
char *format¶
ë¨ì¼ í목ì ë´ì©ì ì¤ëª íë
struct모ë ì¤íì¼ ë¬¸ë²ì NULL ì¢ ë£ ë¬¸ìì´. ì´ê²ì´NULLì´ë©´,"B"(ë¶í¸ ìë ë°ì´í¸)를 ê°ì í©ëë¤.ì´ íëë
PyBUF_FORMATíëê·¸ë¡ ì ì´ë©ëë¤.
-
int ndim¶
ë©ëª¨ë¦¬ê° n ì°¨ì ë°°ì´ë¡ ëíë´ë ì°¨ì ì.
0ì´ë©´,bufë ì¤ì¹¼ë¼ë¥¼ ëíë´ë ë¨ì¼ í목ì ê°ë¦¬ íµëë¤. ì´ ê²½ì°,shape,stridesë°suboffsetsë ë°ëìNULLì´ì´ì¼ í©ëë¤. ìµë ì°¨ì ìëPyBUF_MAX_NDIMì¼ë¡ ì§ì ë©ëë¤.
-
Py_ssize_t *shape¶
n-ì°¨ì ë°°ì´ë¡ ë©ëª¨ë¦¬ì 모ìì ëíë´ë 길ì´
ndimìPy_ssize_të°°ì´.shape[0] * ... * shape[ndim-1] * itemsizeëlenê³¼ ê°ìì¼ í©ëë¤.모ì ê°ì
shape[n] >= 0ë¡ ì íë©ëë¤.shape[n] == 0ì¸ ê²½ì°ë í¹ë³í 주ìê° íìí©ëë¤. ìì¸í ì ë³´ë ë³µì¡í ë°°ì´ì 참조íììì¤.shape ë°°ì´ì ìë¹ììê² ì½ê¸° ì ì©ì ëë¤.
-
Py_ssize_t *strides¶
ê° ì°¨ììì ì ìì를 ê°ì ¸ì¤ê¸° ìí´ ê±´ëë¸ ë°ì´í¸ ì를 ì ê³µíë 길ì´
ndimìPy_ssize_të°°ì´.ì¤í¸ë¼ì´ë ê°ì ììì ì ìì¼ ì ììµëë¤. ì¼ë° ë°°ì´ì ê²½ì°, ì¤í¸ë¼ì´ëë ë³´íµ ììì´ì§ë§, ìë¹ìë
strides[n] <= 0ì¸ ê²½ì°ë¥¼ ì²ë¦¬í ì ìì´ì¼ í©ëë¤. ìì¸í ë´ì©ì ë³µì¡í ë°°ì´ì 참조íììì¤.strides ë°°ì´ì ìë¹ììê² ì½ê¸° ì ì©ì ëë¤.
-
Py_ssize_t *suboffsets¶
길ì´
ndimìPy_ssize_të°°ì´.suboffsets[n] >= 0ë©´, n ë²ì§¸ ì°¨ìì ë°ë¼ ì ì¥ë ê°ì í¬ì¸í°ì´ê³ ìë¸ ì¤íì ê°ì ì참조(de-referencing) í ê° í¬ì¸í°ì ëí ë°ì´í¸ ì를 ëíë ëë¤. ìì ìë¸ ì¤íì ê°ì ì참조(de-referencing)ê° ë°ìíì§ ììì¼ í¨ì ëíë ëë¤ (ì°ì ë©ëª¨ë¦¬ ë¸ë¡ììì ì¤í¸ë¼ì´ë).모ë ìë¸ ì¤íì ì´ ììë©´ (ì¦, ìì°¸ì¡°ê° íìíì§ ìì¼ë©´), ì´ íëë
NULL(기본ê°) ì´ì´ì¼ í©ëë¤.ì´ ì íì ë°°ì´ ííì íì´ì¬ ì´ë¯¸ì§ ë¼ì´ë¸ë¬ë¦¬(PIL)ìì ì¬ì©ë©ëë¤. ì´ë¬í ë°°ì´ ììì ì¡ì¸ì¤íë ë°©ë²ì ëí ìì¸í ë´ì©ì ë³µì¡í ë°°ì´ì 참조íììì¤.
suboffsets ë°°ì´ì ìë¹ììê² ì½ê¸° ì ì©ì ëë¤.
-
void *internal¶
ì´ê²ì ì ê³µíë(exporting) ê°ì²´ì ìí´ ë´ë¶ì ì¼ë¡ ì¬ì©ë©ëë¤. ì를 ë¤ì´, ì´ê²ì ì ê³µì(exporter)ê° ì ìë¡ ë¤ì ìºì¤í í ì ìì¼ë©°, ë²í¼ê° í´ì ë ë shape, strides ë° suboffsets ë°°ì´ì í´ì í´ì¼ íëì§ì ëí íë그를 ì ì¥íë ë° ì¬ì©ë©ëë¤. ìë¹ìê° ì´ ê°ì ë³ê²½í´ìë ì ë©ëë¤.
-
void *buf¶
ìì:
-
PyBUF_MAX_NDIM¶
- Part of the ìì ABI ë²ì 3.11 ì´íë¡.
ë©ëª¨ë¦¬ê° ëíë´ë ìµë ì°¨ì ì ì ëë¤. ì ê³µìë ì´ ì íì ì¡´ì¤í´ì¼ íë©°, ë¤ì°¨ì ë²í¼ì ìë¹ìë
PyBUF_MAX_NDIMì°¨ìê¹ì§ ì²ë¦¬í ì ìì´ì¼ í©ëë¤. íì¬ 64ë¡ ì¤ì ëììµëë¤.
ë²í¼ ìì² ì í¶
ë²í¼ë ëê° PyObject_GetBuffer()를 íµí´ ì ê³µíë(exporting) ê°ì²´ë¡ ë²í¼ ìì²ì ë³´ë´ì ì»ìµëë¤. ë©ëª¨ë¦¬ì ë
¼ë¦¬ì 구조ì ë³µì¡ì±ì´ í¬ê² ë¤ë¥¼ ì ìì¼ë¯ë¡, ìë¹ìë ì²ë¦¬í ì ìë ì íí ë²í¼ ì íì ì§ì í기 ìí´ flags ì¸ì를 ì¬ì©í©ëë¤.
모ë Py_buffer íëë ìì² ì íì ìí´ ëª¨í¸íì§ ìê² ì ìë©ëë¤.
ìì² ë 립ì íë¶
ë¤ì íëë flagsì ìí¥ì ë°ì§ ìê³ íì ì¬ë°ë¥¸ ê°ì¼ë¡ ì±ìì ¸ì¼ í©ëë¤: obj, buf, len, itemsize, ndim.
readonly, format¶
- PyBUF_WRITABLE¶
- Part of the ìì ABI ë²ì 3.11 ì´íë¡.
readonlyíë를 ì ì´í©ëë¤. ì¤ì ëë©´, ì ê³µìë ë°ëì ì°ê¸° ê°ë¥í ë²í¼ë¥¼ ì ê³µíê±°ë ì¤í¨ë¥¼ ë³´ê³ í´ì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´, ì ê³µìë ì½ê¸° ì ì© ë²í¼ë ì°ê¸° ê°ë¥ ë²í¼ë¥¼ ì ê³µí ì ìì§ë§, 모ë ìë¹ìì ëí´ ì¼ê´ì±ì ì ì§í´ì¼ í©ëë¤. ì를 ë¤ì´, ê°ë¨í ì°ê¸° ê°ë¥ ë²í¼ë¥¼ ìì²íë ¤ë©´ PyBUF_SIMPLE | PyBUF_WRITABLEì ì¬ì©í ì ììµëë¤.
- PyBUF_WRITEABLE¶
This is a soft deprecated alias to
PyBUF_WRITABLE.
- PyBUF_FORMAT¶
- Part of the ìì ABI ë²ì 3.11 ì´íë¡.
formatíë를 ì ì´í©ëë¤. ì¤ì ëë©´, ì´ íë를 ì¬ë°ë¥´ê² ì±ìì¼ í©ëë¤. ê·¸ë ì§ ìì¼ë©´, ì´ íëë ë°ëìNULLì´ì´ì¼ í©ëë¤.
PyBUF_WRITABLEì ë¤ì ì¹ì
ì 모ë íëê·¸ì | ë ì ììµëë¤. PyBUF_SIMPLEì´ 0ì¼ë¡ ì ìëë¯ë¡, PyBUF_WRITABLEì ë
립í íëê·¸ë¡ ì¬ì©ëì´ ê°ë¨í ì°ê¸° ê°ë¥í ë²í¼ë¥¼ ìì²í ì ììµëë¤.
PyBUF_FORMATì PyBUF_SIMPLEì ì ì¸í ììì íëê·¸ì | ëì´ì¼ í©ëë¤. PyBUF_SIMPLE ì ì´ë¯¸ íì B(ë¶í¸ ìë ë°ì´í¸)를 ì미í기 ë문ì
ëë¤. PyBUF_FORMATì ë¨ë
ì¼ë¡ ì¬ì©í ì ììµëë¤.
shape, strides, suboffsets¶
ë©ëª¨ë¦¬ì ë ¼ë¦¬ 구조를 ì ì´íë íëê·¸ë ë³µì¡ëê° ê°ìíë ììë¡ ëì´ë©ëë¤. ê° íëê·¸ë ê·¸ ìëì ìë íëê·¸ì 모ë ë¹í¸ë¥¼ í¬í¨í©ëë¤.
ìì² |
shape |
strides |
suboffsets |
|---|---|---|---|
|
yes |
yes |
íìíë©´ |
|
yes |
yes |
NULL |
|
yes |
NULL |
NULL |
|
NULL |
NULL |
NULL |
ì°ìì± ìì²Â¶
C ë í¬í¸ë ì°ìì±ì ëª ìì ì¼ë¡ ìì²í ì ìëë°, ì¤í¸ë¼ì´ë ì 보를 í¬í¨í기ë ê·¸ë ì§ ì기ë í©ëë¤. ì¤í¸ë¼ì´ë ì ë³´ê° ìì¼ë©´, ë²í¼ë C-ì°ìì´ì´ì¼ í©ëë¤.
ìì² |
shape |
strides |
suboffsets |
ì°ìì± |
|---|---|---|---|---|
|
yes |
yes |
NULL |
C |
|
yes |
yes |
NULL |
F |
|
yes |
yes |
NULL |
C ëë F |
yes |
NULL |
NULL |
C |
ë³µí© ìì²Â¶
모ë ê°ë¥í ìì²ì ì ì ì íëê·¸ ì¡°í©ì ìí´ ìì í ì ìë©ëë¤. í¸ìì, ë²í¼ íë¡í ì½ì ì주 ì¬ì©ëë ì¡°í©ì ë¨ì¼ íëê·¸ë¡ ì ê³µí©ëë¤.
ë¤ì íìì Uë ì ìëì§ ìì ì°ìì±ì ëíë
ëë¤. ìë¹ìë ì°ìì±ì íë¨í기 ìí´ PyBuffer_IsContiguous()를 í¸ì¶í´ì¼ í©ëë¤.
ìì² |
shape |
strides |
suboffsets |
ì°ìì± |
readonly |
format |
|---|---|---|---|---|---|---|
|
yes |
yes |
íìíë©´ |
U |
0 |
yes |
|
yes |
yes |
íìíë©´ |
U |
1 ëë 0 |
yes |
|
yes |
yes |
NULL |
U |
0 |
yes |
|
yes |
yes |
NULL |
U |
1 ëë 0 |
yes |
|
yes |
yes |
NULL |
U |
0 |
NULL |
|
yes |
yes |
NULL |
U |
1 ëë 0 |
NULL |
|
yes |
NULL |
NULL |
C |
0 |
NULL |
|
yes |
NULL |
NULL |
C |
1 ëë 0 |
NULL |
ë³µì¡í ë°°ì´Â¶
NumPy-ì¤íì¼: shapeê³¼ strides¶
NumPy ì¤íì¼ ë°°ì´ì ë
¼ë¦¬ì 구조ë itemsize, ndim, shape ë° stridesë¡ ì ìë©ëë¤.
ndim == 0ì´ë©´, bufê° ê°ë¦¬í¤ë ë©ëª¨ë¦¬ ìì¹ê° itemsize í¬ê¸°ì ì¤ì¹¼ë¼ë¡ í´ìë©ëë¤. ì´ ê²½ì°, shape ê³¼ stridesë 모ë NULLì
ëë¤.
stridesê° NULLì´ë©´, ë°°ì´ì íì¤ n-ì°¨ì C ë°°ì´ë¡ í´ìë©ëë¤. ê·¸ë ì§ ìì¼ë©´, ìë¹ìë ë¤ìê³¼ ê°ì´ n-ì°¨ì ë°°ì´ì ì¡ì¸ì¤í´ì¼ í©ëë¤:
ptr = (char *)buf + indices[0] * strides[0] + ... + indices[n-1] * strides[n-1];
item = *((typeof(item) *)ptr);
ììì ì¸ê¸íë¯ì´, bufë ì¤ì ë©ëª¨ë¦¬ ë¸ë¡ ë´ì 모ë ìì¹ë¥¼ ê°ë¦¬í¬ ì ììµëë¤. ì ê³µì(exporter)ë ì´ í¨ìë¡ ë²í¼ì ì í¨ì±ì ê²ì¬ í ì ììµëë¤:
def verify_structure(memlen, itemsize, ndim, shape, strides, offset):
"""ë§¤ê° ë³ìê° í ë¹ë ë©ëª¨ë¦¬ ë²ì ë´ìì ì í¨í ë°°ì´ì ëíë´ëì§ íì¸í©ëë¤:
char *mem: 물리ì ë©ëª¨ë¦¬ ë¸ë¡ì ìì
memlen: 물리ì ë©ëª¨ë¦¬ ë¸ë¡ì 길ì´
offset: (char *)buf - mem
"""
if offset % itemsize:
return False
if offset < 0 or offset+itemsize > memlen:
return False
if any(v % itemsize for v in strides):
return False
if ndim <= 0:
return ndim == 0 and not shape and not strides
if 0 in shape:
return True
imin = sum(strides[j]*(shape[j]-1) for j in range(ndim)
if strides[j] <= 0)
imax = sum(strides[j]*(shape[j]-1) for j in range(ndim)
if strides[j] > 0)
return 0 <= offset+imin and offset+imax+itemsize <= memlen
PIL-ì¤íì¼: shape, strides ë° suboffsets¶
ì¼ë° í목 ì¸ìë, PIL ì¤íì¼ ë°°ì´ìë ì°¨ìì ë¤ì ìì를 ê°ì ¸ì¤ê¸° ìí´ ë°ë¼ì¼ íë í¬ì¸í°ê° í¬í¨ë ì ììµëë¤. ì를 ë¤ì´, ì¼ë° 3-ì°¨ì C ë°°ì´ char v[2][2][3]ë 2ê°ì 2-ì°¨ì ë°°ì´ì ê°ë¦¬í¤ë 2ê°ì í¬ì¸í° ë°°ì´ë¡ ë³¼ ìë ììµëë¤: char (*v[2])[2][3]. suboffsets ííìì, ì´ ë í¬ì¸í°ë bufì ìì ë¶ë¶ì ìë² ë ë ì ìëë°, ë©ëª¨ë¦¬ì ì´ë ìì¹ ìë ë°°ì¹ë ì ìë ë ê°ì char x[2][3] ë°°ì´ì ê°ë¦¬íµëë¤.
ë¤ìì NULLì´ ìë stridesì suboffsetsê° ìì ë, N-ì°¨ì ì¸ë±ì¤ê° ê°ë¦¬í¤ë N-ì°¨ì ë°°ì´ì ììì ëí í¬ì¸í°ë¥¼ ë°ííë í¨ìì
ëë¤:
void *get_item_pointer(int ndim, void *buf, Py_ssize_t *strides,
Py_ssize_t *suboffsets, Py_ssize_t *indices) {
char *pointer = (char*)buf;
int i;
for (i = 0; i < ndim; i++) {
pointer += strides[i] * indices[i];
if (suboffsets[i] >=0 ) {
pointer = *((char**)pointer) + suboffsets[i];
}
}
return (void*)pointer;
}