class_docstr: Generate batches of tensor image data with real-time data augmentation.
   The data will be looped over (in batches).
  
  # Arguments
      featurewise_center: Boolean.
          Set input mean to 0 over the dataset, feature-wise.
      samplewise_center: Boolean. Set each sample mean to 0.
      featurewise_std_normalization: Boolean.
          Divide inputs by std of the dataset, feature-wise.
      samplewise_std_normalization: Boolean. Divide each input by its std.
      zca_whitening: Boolean. Apply ZCA whitening.
      zca_epsilon: epsilon for ZCA whitening. Default is 1e-6.
      rotation_range: Int. Degree range for random rotations.
      width_shift_range: Float, 1-D array-like or int
          - float: fraction of total width, if < 1, or pixels if >= 1.
          - 1-D array-like: random elements from the array.
          - int: integer number of pixels from interval
              `(-width_shift_range, +width_shift_range)`
          - With `width_shift_range=2` possible values
              are integers `[-1, 0, +1]`,
              same as with `width_shift_range=[-1, 0, +1]`,
              while with `width_shift_range=1.0` possible values are floats
              in the interval `[-1.0, +1.0)`.
      height_shift_range: Float, 1-D array-like or int
          - float: fraction of total height, if < 1, or pixels if >= 1.
          - 1-D array-like: random elements from the array.
          - int: integer number of pixels from interval
              `(-height_shift_range, +height_shift_range)`
          - With `height_shift_range=2` possible values
              are integers `[-1, 0, +1]`,
              same as with `height_shift_range=[-1, 0, +1]`,
              while with `height_shift_range=1.0` possible values are floats
              in the interval `[-1.0, +1.0)`.
      brightness_range: Tuple or list of two floats. Range for picking
          a brightness shift value from.
      shear_range: Float. Shear Intensity
          (Shear angle in counter-clockwise direction in degrees)
      zoom_range: Float or [lower, upper]. Range for random zoom.
          If a float, `[lower, upper] = [1-zoom_range, 1+zoom_range]`.
      channel_shift_range: Float. Range for random channel shifts.
      fill_mode: One of {"constant", "nearest", "reflect" or "wrap"}.
          Default is 'nearest'.
          Points outside the boundaries of the input are filled
          according to the given mode:
          - 'constant': kkkkkkkk|abcd|kkkkkkkk (cval=k)
          - 'nearest':  aaaaaaaa|abcd|dddddddd
          - 'reflect':  abcddcba|abcd|dcbaabcd
          - 'wrap':  abcdabcd|abcd|abcdabcd
      cval: Float or Int.
          Value used for points outside the boundaries
          when `fill_mode = "constant"`.
      horizontal_flip: Boolean. Randomly flip inputs horizontally.
      vertical_flip: Boolean. Randomly flip inputs vertically.
      rescale: rescaling factor. Defaults to None.
          If None or 0, no rescaling is applied,
          otherwise we multiply the data by the value provided
          (after applying all other transformations).
      preprocessing_function: function that will be applied on each input.
          The function will run after the image is resized and augmented.
          The function should take one argument:
          one image (NumPy tensor with rank 3),
          and should output a NumPy tensor with the same shape.
      data_format: Image data format,
          either "channels_first" or "channels_last".
          "channels_last" mode means that the images should have shape
          `(samples, height, width, channels)`,
          "channels_first" mode means that the images should have shape
          `(samples, channels, height, width)`.
          It defaults to the `image_data_format` value found in your
          Keras config file at `~/.keras/keras.json`.
          If you never set it, then it will be "channels_last".
      validation_split: Float. Fraction of images reserved for validation
          (strictly between 0 and 1).
      interpolation_order: int, order to use for
          the spline interpolation. Higher is slower.
      dtype: Dtype to use for the generated arrays.
  
  # Examples
  Example of using `.flow(x, y)`:
  
  ```python
  (x_train, y_train), (x_test, y_test) = cifar10.load_data()
  y_train = np_utils.to_categorical(y_train, num_classes)
  y_test = np_utils.to_categorical(y_test, num_classes)
  
  datagen = ImageDataGenerator(
      featurewise_center=True,
      featurewise_std_normalization=True,
      rotation_range=20,
      width_shift_range=0.2,
      height_shift_range=0.2,
      horizontal_flip=True)
  
  # compute quantities required for featurewise normalization
  # (std, mean, and principal components if ZCA whitening is applied)
  datagen.fit(x_train)
  
  # fits the model on batches with real-time data augmentation:
  model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                      steps_per_epoch=len(x_train) / 32, epochs=epochs)
  
  # here's a more "manual" example
  for e in range(epochs):
      print('Epoch', e)
      batches = 0
      for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
          model.fit(x_batch, y_batch)
          batches += 1
          if batches >= len(x_train) / 32:
              # we need to break the loop by hand because
              # the generator loops indefinitely
              break
  ```
  Example of using `.flow_from_directory(directory)`:
  
  ```python
  train_datagen = ImageDataGenerator(
          rescale=1./255,
          shear_range=0.2,
          zoom_range=0.2,
          horizontal_flip=True)
  
  test_datagen = ImageDataGenerator(rescale=1./255)
  
  train_generator = train_datagen.flow_from_directory(
          'data/train',
          target_size=(150, 150),
          batch_size=32,
          class_mode='binary')
  
  validation_generator = test_datagen.flow_from_directory(
          'data/validation',
          target_size=(150, 150),
          batch_size=32,
          class_mode='binary')
  
  model.fit_generator(
          train_generator,
          steps_per_epoch=2000,
          epochs=50,
          validation_data=validation_generator,
          validation_steps=800)
  ```
  
  Example of transforming images and masks together.
  
  ```python
  # we create two instances with the same arguments
  data_gen_args = dict(featurewise_center=True,
                       featurewise_std_normalization=True,
                       rotation_range=90,
                       width_shift_range=0.1,
                       height_shift_range=0.1,
                       zoom_range=0.2)
  image_datagen = ImageDataGenerator(**data_gen_args)
  mask_datagen = ImageDataGenerator(**data_gen_args)
  
  # Provide the same seed and keyword arguments to the fit and flow methods
  seed = 1
  image_datagen.fit(images, augment=True, seed=seed)
  mask_datagen.fit(masks, augment=True, seed=seed)
  
  image_generator = image_datagen.flow_from_directory(
      'data/images',
      class_mode=None,
      seed=seed)
  
  mask_generator = mask_datagen.flow_from_directory(
      'data/masks',
      class_mode=None,
      seed=seed)
  
  # combine generators into one which yields image and masks
  train_generator = zip(image_generator, mask_generator)
  
  model.fit_generator(
      train_generator,
      steps_per_epoch=2000,
      epochs=50)
  ```
  
  Example of using ```.flow_from_dataframe(dataframe, directory,
                                          x_col, y_col)```:
  
  ```python
  
  train_df = pandas.read_csv("./train.csv")
  valid_df = pandas.read_csv("./valid.csv")
  
  train_datagen = ImageDataGenerator(
          rescale=1./255,
          shear_range=0.2,
          zoom_range=0.2,
          horizontal_flip=True)
  
  test_datagen = ImageDataGenerator(rescale=1./255)
  
  train_generator = train_datagen.flow_from_dataframe(
          dataframe=train_df,
          directory='data/train',
          x_col="filename",
          y_col="class",
          target_size=(150, 150),
          batch_size=32,
          class_mode='binary')
  
  validation_generator = test_datagen.flow_from_dataframe(
          dataframe=valid_df,
          directory='data/validation',
          x_col="filename",
          y_col="class",
          target_size=(150, 150),
          batch_size=32,
          class_mode='binary')
  
  model.fit_generator(
          train_generator,
          steps_per_epoch=2000,
          epochs=50,
          validation_data=validation_generator,
          validation_steps=800)
  ```
class_docstr_tok: ["Generate","batches","of","tensor","image","data","with","real-time","data","augmentation",".","The","data","will","be","looped","over","(","in","batches",")",".","#","Arguments","featurewise_center",":","Boolean",".","Set","input","mean","to","0","over","the","dataset",",","feature-wise",".","samplewise_center",":","Boolean",".","Set","each","sample","mean","to","0.","featurewise_std_normalization",":","Boolean",".","Divide","inputs","by","std","of","the","dataset",",","feature-wise",".","samplewise_std_normalization",":","Boolean",".","Divide","each","input","by","its","std",".","zca_whitening",":","Boolean",".","Apply","ZCA","whitening",".","zca_epsilon",":","epsilon","for","ZCA","whitening",".","Default","is","1e-6",".","rotation_range",":","Int",".","Degree","range","for","random","rotations",".","width_shift_range",":","Float",",","1-D","array-like","or","int","-","float",":","fraction","of","total","width",",","if","<","1",",","or","pixels","if",">","=","1",".","-","1-D","array-like",":","random","elements","from","the","array",".","-","int",":","integer","number","of","pixels","from","interval","`","(","-width_shift_range",",","+width_shift_range",")","`","-","With","`","width_shift_range=2","`","possible","values","are","integers","`","[","-1",",","0",",","+1","]","`",",","same","as","with","`","width_shift_range=","[","-1",",","0",",","+1","]","`",",","while","with","`","width_shift_range=1.0","`","possible","values","are","floats","in","the","interval","`","[","-1.0",",","+1.0",")","`",".","height_shift_range",":","Float",",","1-D","array-like","or","int","-","float",":","fraction","of","total","height",",","if","<","1",",","or","pixels","if",">","=","1",".","-","1-D","array-like",":","random","elements","from","the","array",".","-","int",":","integer","number","of","pixels","from","interval","`","(","-height_shift_range",",","+height_shift_range",")","`","-","With","`","height_shift_range=2","`","possible","values","are","integers","`","[","-1",",","0",",","+1","]","`",",","same","as","with","`","height_shift_range=","[","-1",",","0",",","+1","]","`",",","while","with","`","height_shift_range=1.0","`","possible","values","are","floats","in","the","interval","`","[","-1.0",",","+1.0",")","`",".","brightness_range",":","Tuple","or","list","of","two","floats",".","Range","for","picking","a","brightness","shift","value","from",".","shear_range",":","Float",".","Shear","Intensity","(","Shear","angle","in","counter-clockwise","direction","in","degrees",")","zoom_range",":","Float","or","[","lower",",","upper","]",".","Range","for","random","zoom",".","If","a","float",",","`","[","lower",",","upper","]","=","[","1-zoom_range",",","1+zoom_range","]","`",".","channel_shift_range",":","Float",".","Range","for","random","channel","shifts",".","fill_mode",":","One","of","{","``","constant","''",",","``","nearest","''",",","``","reflect","''","or","``","wrap","''","}",".","Default","is","'nearest","'",".","Points","outside","the","boundaries","of","the","input","are","filled","according","to","the","given","mode",":","-","'constant","'",":","kkkkkkkk|abcd|kkkkkkkk","(","cval=k",")","-","'nearest","'",":","aaaaaaaa|abcd|dddddddd","-","'reflect","'",":","abcddcba|abcd|dcbaabcd","-","'wrap","'",":","abcdabcd|abcd|abcdabcd","cval",":","Float","or","Int",".","Value","used","for","points","outside","the","boundaries","when","`","fill_mode","=","``","constant","''","`",".","horizontal_flip",":","Boolean",".","Randomly","flip","inputs","horizontally",".","vertical_flip",":","Boolean",".","Randomly","flip","inputs","vertically",".","rescale",":","rescaling","factor",".","Defaults","to","None",".","If","None","or","0",",","no","rescaling","is","applied",",","otherwise","we","multiply","the","data","by","the","value","provided","(","after","applying","all","other","transformations",")",".","preprocessing_function",":","function","that","will","be","applied","on","each","input",".","The","function","will","run","after","the","image","is","resized","and","augmented",".","The","function","should","take","one","argument",":","one","image","(","NumPy","tensor","with","rank","3",")",",","and","should","output","a","NumPy","tensor","with","the","same","shape",".","data_format",":","Image","data","format",",","either","``","channels_first","''","or","``","channels_last","''",".","``","channels_last","''","mode","means","that","the","images","should","have","shape","`","(","samples",",","height",",","width",",","channels",")","`",",","``","channels_first","''","mode","means","that","the","images","should","have","shape","`","(","samples",",","channels",",","height",",","width",")","`",".","It","defaults","to","the","`","image_data_format","`","value","found","in","your","Keras","config","file","at","`","~\/.keras\/keras.json","`",".","If","you","never","set","it",",","then","it","will","be","``","channels_last","''",".","validation_split",":","Float",".","Fraction","of","images","reserved","for","validation","(","strictly","between","0","and","1",")",".","interpolation_order",":","int",",","order","to","use","for","the","spline","interpolation",".","Higher","is","slower",".","dtype",":","Dtype","to","use","for","the","generated","arrays",".","#","Examples","Example","of","using","`",".flow","(","x",",","y",")","`",":","``","`","python","(","x_train",",","y_train",")",",","(","x_test",",","y_test",")","=","cifar10.load_data","(",")","y_train","=","np_utils.to_categorical","(","y_train",",","num_classes",")","y_test","=","np_utils.to_categorical","(","y_test",",","num_classes",")","datagen","=","ImageDataGenerator","(","featurewise_center=True",",","featurewise_std_normalization=True",",","rotation_range=20",",","width_shift_range=0.2",",","height_shift_range=0.2",",","horizontal_flip=True",")","#","compute","quantities","required","for","featurewise","normalization","#","(","std",",","mean",",","and","principal","components","if","ZCA","whitening","is","applied",")","datagen.fit","(","x_train",")","#","fits","the","model","on","batches","with","real-time","data","augmentation",":","model.fit_generator","(","datagen.flow","(","x_train",",","y_train",",","batch_size=32",")",",","steps_per_epoch=len","(","x_train",")","\/","32",",","epochs=epochs",")","#","here","'s","a","more","``","manual","''","example","for","e","in","range","(","epochs",")",":","print","(","'Epoch","'",",","e",")","batches","=","0","for","x_batch",",","y_batch","in","datagen.flow","(","x_train",",","y_train",",","batch_size=32",")",":","model.fit","(","x_batch",",","y_batch",")","batches","+=","1","if","batches",">","=","len","(","x_train",")","\/","32",":","#","we","need","to","break","the","loop","by","hand","because","#","the","generator","loops","indefinitely","break","``","`","Example","of","using","`",".flow_from_directory","(","directory",")","`",":","``","`","python","train_datagen","=","ImageDataGenerator","(","rescale=1.\/255",",","shear_range=0.2",",","zoom_range=0.2",",","horizontal_flip=True",")","test_datagen","=","ImageDataGenerator","(","rescale=1.\/255",")","train_generator","=","train_datagen.flow_from_directory","(","'data\/train","'",",","target_size=","(","150",",","150",")",",","batch_size=32",",","class_mode='binary","'",")","validation_generator","=","test_datagen.flow_from_directory","(","'data\/validation","'",",","target_size=","(","150",",","150",")",",","batch_size=32",",","class_mode='binary","'",")","model.fit_generator","(","train_generator",",","steps_per_epoch=2000",",","epochs=50",",","validation_data=validation_generator",",","validation_steps=800",")","``","`","Example","of","transforming","images","and","masks","together",".","``","`","python","#","we","create","two","instances","with","the","same","arguments","data_gen_args","=","dict","(","featurewise_center=True",",","featurewise_std_normalization=True",",","rotation_range=90",",","width_shift_range=0.1",",","height_shift_range=0.1",",","zoom_range=0.2",")","image_datagen","=","ImageDataGenerator","(","*","*","data_gen_args",")","mask_datagen","=","ImageDataGenerator","(","*","*","data_gen_args",")","#","Provide","the","same","seed","and","keyword","arguments","to","the","fit","and","flow","methods","seed","=","1","image_datagen.fit","(","images",",","augment=True",",","seed=seed",")","mask_datagen.fit","(","masks",",","augment=True",",","seed=seed",")","image_generator","=","image_datagen.flow_from_directory","(","'data\/images","'",",","class_mode=None",",","seed=seed",")","mask_generator","=","mask_datagen.flow_from_directory","(","'data\/masks","'",",","class_mode=None",",","seed=seed",")","#","combine","generators","into","one","which","yields","image","and","masks","train_generator","=","zip","(","image_generator",",","mask_generator",")","model.fit_generator","(","train_generator",",","steps_per_epoch=2000",",","epochs=50",")","``","`","Example","of","using","``","`",".flow_from_dataframe","(","dataframe",",","directory",",","x_col",",","y_col",")","``","`",":","``","`","python","train_df","=","pandas.read_csv","(","``",".\/train.csv","''",")","valid_df","=","pandas.read_csv","(","``",".\/valid.csv","''",")","train_datagen","=","ImageDataGenerator","(","rescale=1.\/255",",","shear_range=0.2",",","zoom_range=0.2",",","horizontal_flip=True",")","test_datagen","=","ImageDataGenerator","(","rescale=1.\/255",")","train_generator","=","train_datagen.flow_from_dataframe","(","dataframe=train_df",",","directory='data\/train","'",",","x_col=","''","filename","''",",","y_col=","''","class","''",",","target_size=","(","150",",","150",")",",","batch_size=32",",","class_mode='binary","'",")","validation_generator","=","test_datagen.flow_from_dataframe","(","dataframe=valid_df",",","directory='data\/validation","'",",","x_col=","''","filename","''",",","y_col=","''","class","''",",","target_size=","(","150",",","150",")",",","batch_size=32",",","class_mode='binary","'",")","model.fit_generator","(","train_generator",",","steps_per_epoch=2000",",","epochs=50",",","validation_data=validation_generator",",","validation_steps=800",")","``","`"]
docstr: Takes data & label arrays, generates batches of augmented data.
  
  # Arguments
      x: Input data. NumPy array of rank 4 or a tuple.
          If tuple, the first element
          should contain the images and the second element
          another NumPy array or a list of NumPy arrays
          that gets passed to the output
          without any modifications.
          Can be used to feed the model miscellaneous data
          along with the images.
          In case of grayscale data, the channels axis of the image array
          should have value 1, in case
          of RGB data, it should have value 3, and in case
          of RGBA data, it should have value 4.
      y: Labels.
      batch_size: Int (default: 32).
      shuffle: Boolean (default: True).
      sample_weight: Sample weights.
      seed: Int (default: None).
      save_to_dir: None or str (default: None).
          This allows you to optionally specify a directory
          to which to save the augmented pictures being generated
          (useful for visualizing what you are doing).
      save_prefix: Str (default: `''`).
          Prefix to use for filenames of saved pictures
          (only relevant if `save_to_dir` is set).
      save_format: one of "png", "jpeg"
          (only relevant if `save_to_dir` is set). Default: "png".
      ignore_class_split: Boolean (default: False), ignore difference
          in number of classes in labels across train and validation
          split (useful for non-classification tasks)
      subset: Subset of data (`"training"` or `"validation"`) if
          `validation_split` is set in `ImageDataGenerator`.
  
  # Returns
      An `Iterator` yielding tuples of `(x, y)`
          where `x` is a NumPy array of image data
          (in the case of a single image input) or a list
          of NumPy arrays (in the case with
          additional inputs) and `y` is a NumPy array
          of corresponding labels. If 'sample_weight' is not None,
          the yielded tuples are of the form `(x, y, sample_weight)`.
          If `y` is None, only the NumPy array `x` is returned.
docstr_tok: ["Takes","data","&","label","arrays",",","generates","batches","of","augmented","data",".","#","Arguments","x",":","Input","data",".","NumPy","array","of","rank","4","or","a","tuple",".","If","tuple",",","the","first","element","should","contain","the","images","and","the","second","element","another","NumPy","array","or","a","list","of","NumPy","arrays","that","gets","passed","to","the","output","without","any","modifications",".","Can","be","used","to","feed","the","model","miscellaneous","data","along","with","the","images",".","In","case","of","grayscale","data",",","the","channels","axis","of","the","image","array","should","have","value","1",",","in","case","of","RGB","data",",","it","should","have","value","3",",","and","in","case","of","RGBA","data",",","it","should","have","value","4.","y",":","Labels",".","batch_size",":","Int","(","default",":","32",")",".","shuffle",":","Boolean","(","default",":","True",")",".","sample_weight",":","Sample","weights",".","seed",":","Int","(","default",":","None",")",".","save_to_dir",":","None","or","str","(","default",":","None",")",".","This","allows","you","to","optionally","specify","a","directory","to","which","to","save","the","augmented","pictures","being","generated","(","useful","for","visualizing","what","you","are","doing",")",".","save_prefix",":","Str","(","default",":","`","``","`",")",".","Prefix","to","use","for","filenames","of","saved","pictures","(","only","relevant","if","`","save_to_dir","`","is","set",")",".","save_format",":","one","of","``","png","''",",","``","jpeg","''","(","only","relevant","if","`","save_to_dir","`","is","set",")",".","Default",":","``","png","''",".","ignore_class_split",":","Boolean","(","default",":","False",")",",","ignore","difference","in","number","of","classes","in","labels","across","train","and","validation","split","(","useful","for","non-classification","tasks",")","subset",":","Subset","of","data","(","`","``","training","''","`","or","`","``","validation","''","`",")","if","`","validation_split","`","is","set","in","`","ImageDataGenerator","`",".","#","Returns","An","`","Iterator","`","yielding","tuples","of","`","(","x",",","y",")","`","where","`","x","`","is","a","NumPy","array","of","image","data","(","in","the","case","of","a","single","image","input",")","or","a","list","of","NumPy","arrays","(","in","the","case","with","additional","inputs",")","and","`","y","`","is","a","NumPy","array","of","corresponding","labels",".","If","'sample_weight","'","is","not","None",",","the","yielded","tuples","are","of","the","form","`","(","x",",","y",",","sample_weight",")","`",".","If","`","y","`","is","None",",","only","the","NumPy","array","`","x","`","is","returned","."]
code: def flow(
      self,
      x,
      y=None,
      batch_size=32,
      shuffle=True,
      sample_weight=None,
      seed=None,
      save_to_dir=None,
      save_prefix="",
      save_format="png",
      ignore_class_split=False,
      subset=None,
  ):
      """Takes data & label arrays, generates batches of augmented data.
  
      # Arguments
          x: Input data. NumPy array of rank 4 or a tuple.
              If tuple, the first element
              should contain the images and the second element
              another NumPy array or a list of NumPy arrays
              that gets passed to the output
              without any modifications.
              Can be used to feed the model miscellaneous data
              along with the images.
              In case of grayscale data, the channels axis of the image array
              should have value 1, in case
              of RGB data, it should have value 3, and in case
              of RGBA data, it should have value 4.
          y: Labels.
          batch_size: Int (default: 32).
          shuffle: Boolean (default: True).
          sample_weight: Sample weights.
          seed: Int (default: None).
          save_to_dir: None or str (default: None).
              This allows you to optionally specify a directory
              to which to save the augmented pictures being generated
              (useful for visualizing what you are doing).
          save_prefix: Str (default: `''`).
              Prefix to use for filenames of saved pictures
              (only relevant if `save_to_dir` is set).
          save_format: one of "png", "jpeg"
              (only relevant if `save_to_dir` is set). Default: "png".
          ignore_class_split: Boolean (default: False), ignore difference
              in number of classes in labels across train and validation
              split (useful for non-classification tasks)
          subset: Subset of data (`"training"` or `"validation"`) if
              `validation_split` is set in `ImageDataGenerator`.
  
      # Returns
          An `Iterator` yielding tuples of `(x, y)`
              where `x` is a NumPy array of image data
              (in the case of a single image input) or a list
              of NumPy arrays (in the case with
              additional inputs) and `y` is a NumPy array
              of corresponding labels. If 'sample_weight' is not None,
              the yielded tuples are of the form `(x, y, sample_weight)`.
              If `y` is None, only the NumPy array `x` is returned.
      """
      return NumpyArrayIterator(
          x,
          y,
          self,
          batch_size=batch_size,
          shuffle=shuffle,
          sample_weight=sample_weight,
          seed=seed,
          data_format=self.data_format,
          save_to_dir=save_to_dir,
          save_prefix=save_prefix,
          save_format=save_format,
          ignore_class_split=ignore_class_split,
          subset=subset,
          dtype=self.dtype,
      )
  
file_path: keras-preprocessing/keras_preprocessing/image/image_data_generator.py
imports: import warnings
  import numpy
  from .affine_transformations import apply_affine_transform, apply_brightness_shift, apply_channel_shift, flip_axis
  from .dataframe_iterator import DataFrameIterator
  from .directory_iterator import DirectoryIterator
  from .numpy_array_iterator import NumpyArrayIterator
label_desc: Use image node_id 2 for calling the ImageDataGenerator obj's underlying member method code with example usage: obj.flow(x, y, batch_size, shuffle, sample_weight, seed, save_to_dir, save_prefix, save_format, ignore_class_split, subset) and returns: NumpyArrayIterator