class_docstr: GPU data buffer that is aware of data type and elements size
  
  Parameters
  ----------
  data : ndarray | None
      Buffer data.
class_docstr_tok: ["GPU","data","buffer","that","is","aware","of","data","type","and","elements","size","Parameters","--","--","--","--","--","data",":","ndarray","|","None","Buffer","data","."]
docstr: Set data (deferred operation)
  
  Parameters
  ----------
  data : ndarray
      Data to be uploaded
  copy: bool
      Since the operation is deferred, data may change before
      data is actually uploaded to GPU memory.
      Asking explicitly for a copy will prevent this behavior.
  **kwargs : dict
      Additional arguments.
code: def set_data(self, data, copy=False, **kwargs):
      """Set data (deferred operation)
  
      Parameters
      ----------
      data : ndarray
          Data to be uploaded
      copy: bool
          Since the operation is deferred, data may change before
          data is actually uploaded to GPU memory.
          Asking explicitly for a copy will prevent this behavior.
      **kwargs : dict
          Additional arguments.
      """
      data = self._prepare_data(data, **kwargs)
      self._dtype = data.dtype
      # This works around some strange NumPy bug where a float32 array
      # of shape (155407, 1) was said to have strides
      # (4, 9223372036854775807), which is crazy
      self._stride = data.strides[-1]
      self._itemsize = self._dtype.itemsize
      Buffer.set_data(self, data=data, copy=copy)
  
imports: import numpy
  from os import path
  from traceback import extract_stack, format_list
  import weakref
  from .globject import GLObject
  from ..util import logger
label_desc: Use image node_id 4 for calling the DataBuffer obj's underlying member method code with example usage: obj.set_data(data, copy) without return types