maxframe 1.3.1__cp39-cp39-win32.whl → 2.0.0b1__cp39-cp39-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/_utils.cp39-win32.pyd +0 -0
- maxframe/_utils.pyi +21 -0
- maxframe/_utils.pyx +4 -3
- maxframe/codegen/__init__.py +27 -0
- maxframe/{codegen.py → codegen/core.py} +49 -43
- maxframe/codegen/spe/__init__.py +16 -0
- maxframe/codegen/spe/core.py +307 -0
- maxframe/codegen/spe/dataframe/__init__.py +37 -0
- maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
- maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
- maxframe/codegen/spe/dataframe/datasource.py +181 -0
- maxframe/codegen/spe/dataframe/datastore.py +204 -0
- maxframe/codegen/spe/dataframe/extensions.py +63 -0
- maxframe/codegen/spe/dataframe/fetch.py +26 -0
- maxframe/codegen/spe/dataframe/groupby.py +224 -0
- maxframe/codegen/spe/dataframe/indexing.py +238 -0
- maxframe/codegen/spe/dataframe/merge.py +73 -0
- maxframe/codegen/spe/dataframe/misc.py +286 -0
- maxframe/codegen/spe/dataframe/missing.py +64 -0
- maxframe/codegen/spe/dataframe/reduction.py +160 -0
- maxframe/codegen/spe/dataframe/sort.py +83 -0
- maxframe/codegen/spe/dataframe/statistics.py +46 -0
- maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
- maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
- maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
- maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
- maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
- maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
- maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
- maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
- maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
- maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
- maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
- maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
- maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
- maxframe/codegen/spe/dataframe/tseries.py +46 -0
- maxframe/codegen/spe/dataframe/udf.py +62 -0
- maxframe/codegen/spe/dataframe/value_counts.py +31 -0
- maxframe/codegen/spe/dataframe/window.py +65 -0
- maxframe/codegen/spe/learn/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
- maxframe/codegen/spe/learn/contrib/models.py +41 -0
- maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
- maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
- maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
- maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
- maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
- maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
- maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
- maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
- maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
- maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
- maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
- maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
- maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
- maxframe/codegen/spe/learn/utils/__init__.py +15 -0
- maxframe/codegen/spe/learn/utils/checks.py +55 -0
- maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
- maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
- maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
- maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
- maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
- maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
- maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
- maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
- maxframe/codegen/spe/learn/utils/validation.py +35 -0
- maxframe/codegen/spe/objects.py +26 -0
- maxframe/codegen/spe/remote.py +29 -0
- maxframe/codegen/spe/tensor/__init__.py +28 -0
- maxframe/codegen/spe/tensor/arithmetic.py +95 -0
- maxframe/codegen/spe/tensor/core.py +41 -0
- maxframe/codegen/spe/tensor/datasource.py +165 -0
- maxframe/codegen/spe/tensor/extensions.py +35 -0
- maxframe/codegen/spe/tensor/fetch.py +26 -0
- maxframe/codegen/spe/tensor/indexing.py +63 -0
- maxframe/codegen/spe/tensor/linalg.py +63 -0
- maxframe/codegen/spe/tensor/merge.py +31 -0
- maxframe/codegen/spe/tensor/misc.py +121 -0
- maxframe/codegen/spe/tensor/random.py +29 -0
- maxframe/codegen/spe/tensor/reduction.py +39 -0
- maxframe/codegen/spe/tensor/reshape.py +26 -0
- maxframe/codegen/spe/tensor/sort.py +42 -0
- maxframe/codegen/spe/tensor/special.py +35 -0
- maxframe/codegen/spe/tensor/statistics.py +24 -0
- maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
- maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
- maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
- maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
- maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
- maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
- maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
- maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
- maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
- maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
- maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
- maxframe/codegen/spe/tests/__init__.py +13 -0
- maxframe/codegen/spe/tests/test_remote.py +29 -0
- maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
- maxframe/codegen/spe/utils.py +54 -0
- maxframe/codegen/tests/__init__.py +13 -0
- maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
- maxframe/config/__init__.py +1 -1
- maxframe/config/config.py +50 -23
- maxframe/config/tests/test_config.py +4 -12
- maxframe/config/validators.py +5 -0
- maxframe/conftest.py +38 -10
- maxframe/core/__init__.py +1 -0
- maxframe/core/context.py +110 -0
- maxframe/core/entity/__init__.py +1 -0
- maxframe/core/entity/core.py +0 -7
- maxframe/core/entity/objects.py +19 -5
- maxframe/core/entity/output_types.py +11 -0
- maxframe/core/entity/tests/test_objects.py +11 -12
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/entity/utils.py +15 -0
- maxframe/core/graph/__init__.py +6 -1
- maxframe/core/graph/builder/base.py +5 -1
- maxframe/core/graph/core.cp39-win32.pyd +0 -0
- maxframe/core/graph/core.pyx +17 -6
- maxframe/core/graph/entity.py +18 -6
- maxframe/core/operator/__init__.py +8 -3
- maxframe/core/operator/base.py +35 -12
- maxframe/core/operator/core.py +37 -14
- maxframe/core/operator/fetch.py +5 -18
- maxframe/core/operator/objects.py +0 -20
- maxframe/core/operator/shuffle.py +6 -72
- maxframe/dataframe/__init__.py +1 -0
- maxframe/dataframe/accessors/datetime_/core.py +7 -4
- maxframe/dataframe/accessors/string_/core.py +9 -6
- maxframe/dataframe/arithmetic/core.py +31 -20
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/dataframe/core.py +98 -91
- maxframe/dataframe/datasource/core.py +8 -1
- maxframe/dataframe/datasource/date_range.py +8 -0
- maxframe/dataframe/datasource/from_index.py +9 -5
- maxframe/dataframe/datasource/from_records.py +9 -2
- maxframe/dataframe/datasource/from_tensor.py +32 -21
- maxframe/dataframe/datasource/read_csv.py +8 -2
- maxframe/dataframe/datasource/read_odps_query.py +33 -3
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +33 -0
- maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
- maxframe/dataframe/datastore/to_csv.py +7 -3
- maxframe/dataframe/datastore/to_odps.py +42 -6
- maxframe/dataframe/extensions/__init__.py +6 -1
- maxframe/dataframe/extensions/apply_chunk.py +96 -136
- maxframe/dataframe/extensions/flatjson.py +3 -2
- maxframe/dataframe/extensions/flatmap.py +15 -7
- maxframe/dataframe/fetch/core.py +12 -1
- maxframe/dataframe/groupby/__init__.py +7 -0
- maxframe/dataframe/groupby/aggregation.py +9 -8
- maxframe/dataframe/groupby/apply.py +50 -74
- maxframe/dataframe/groupby/apply_chunk.py +393 -0
- maxframe/dataframe/groupby/core.py +80 -17
- maxframe/dataframe/groupby/extensions.py +26 -0
- maxframe/dataframe/groupby/fill.py +9 -4
- maxframe/dataframe/groupby/sample.py +7 -7
- maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
- maxframe/dataframe/groupby/transform.py +57 -54
- maxframe/dataframe/indexing/align.py +7 -6
- maxframe/dataframe/indexing/getitem.py +9 -8
- maxframe/dataframe/indexing/iloc.py +28 -23
- maxframe/dataframe/indexing/insert.py +7 -3
- maxframe/dataframe/indexing/loc.py +9 -8
- maxframe/dataframe/indexing/reindex.py +36 -30
- maxframe/dataframe/indexing/rename_axis.py +18 -10
- maxframe/dataframe/indexing/reset_index.py +0 -2
- maxframe/dataframe/indexing/sample.py +13 -9
- maxframe/dataframe/indexing/set_axis.py +9 -6
- maxframe/dataframe/indexing/setitem.py +8 -5
- maxframe/dataframe/indexing/where.py +12 -9
- maxframe/dataframe/merge/__init__.py +0 -1
- maxframe/dataframe/merge/concat.py +10 -31
- maxframe/dataframe/merge/merge.py +2 -24
- maxframe/dataframe/misc/__init__.py +6 -0
- maxframe/dataframe/misc/_duplicate.py +7 -3
- maxframe/dataframe/misc/apply.py +106 -139
- maxframe/dataframe/misc/astype.py +3 -2
- maxframe/dataframe/misc/case_when.py +11 -7
- maxframe/dataframe/misc/cut.py +11 -10
- maxframe/dataframe/misc/describe.py +7 -3
- maxframe/dataframe/misc/drop.py +13 -11
- maxframe/dataframe/misc/eval.py +0 -2
- maxframe/dataframe/misc/get_dummies.py +78 -49
- maxframe/dataframe/misc/isin.py +13 -10
- maxframe/dataframe/misc/map.py +21 -6
- maxframe/dataframe/misc/melt.py +8 -1
- maxframe/dataframe/misc/pivot.py +232 -0
- maxframe/dataframe/misc/pivot_table.py +52 -40
- maxframe/dataframe/misc/rechunk.py +59 -0
- maxframe/dataframe/misc/shift.py +7 -4
- maxframe/dataframe/misc/stack.py +5 -3
- maxframe/dataframe/misc/tests/test_misc.py +167 -1
- maxframe/dataframe/misc/transform.py +63 -65
- maxframe/dataframe/misc/value_counts.py +7 -4
- maxframe/dataframe/missing/dropna.py +16 -7
- maxframe/dataframe/missing/fillna.py +18 -10
- maxframe/dataframe/missing/replace.py +10 -6
- maxframe/dataframe/missing/tests/test_missing.py +2 -2
- maxframe/dataframe/operators.py +1 -27
- maxframe/dataframe/reduction/aggregation.py +65 -3
- maxframe/dataframe/reduction/core.py +3 -1
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
- maxframe/dataframe/reduction/unique.py +53 -7
- maxframe/dataframe/statistics/corr.py +9 -6
- maxframe/dataframe/statistics/quantile.py +9 -6
- maxframe/dataframe/tseries/to_datetime.py +6 -4
- maxframe/dataframe/utils.py +219 -31
- maxframe/dataframe/window/rolling.py +7 -4
- maxframe/env.py +1 -0
- maxframe/errors.py +9 -0
- maxframe/extension.py +13 -2
- maxframe/io/objects/core.py +67 -51
- maxframe/io/objects/tensor.py +73 -17
- maxframe/io/objects/tests/test_object_io.py +8 -55
- maxframe/io/odpsio/arrow.py +15 -2
- maxframe/io/odpsio/schema.py +43 -13
- maxframe/io/odpsio/tableio.py +63 -11
- maxframe/io/odpsio/tests/test_arrow.py +1 -2
- maxframe/io/odpsio/tests/test_schema.py +114 -1
- maxframe/io/odpsio/tests/test_tableio.py +42 -0
- maxframe/io/odpsio/tests/test_volumeio.py +22 -48
- maxframe/learn/__init__.py +2 -2
- maxframe/learn/contrib/__init__.py +2 -2
- maxframe/learn/contrib/graph/connected_components.py +2 -1
- maxframe/learn/contrib/lightgbm/__init__.py +33 -0
- maxframe/learn/contrib/lightgbm/_predict.py +138 -0
- maxframe/learn/contrib/lightgbm/_train.py +163 -0
- maxframe/learn/contrib/lightgbm/callback.py +114 -0
- maxframe/learn/contrib/lightgbm/classifier.py +199 -0
- maxframe/learn/contrib/lightgbm/core.py +372 -0
- maxframe/learn/contrib/lightgbm/dataset.py +153 -0
- maxframe/learn/contrib/lightgbm/regressor.py +29 -0
- maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
- maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
- maxframe/learn/contrib/models.py +38 -9
- maxframe/learn/contrib/utils.py +55 -0
- maxframe/learn/contrib/xgboost/callback.py +86 -0
- maxframe/learn/contrib/xgboost/classifier.py +26 -30
- maxframe/learn/contrib/xgboost/core.py +53 -42
- maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
- maxframe/learn/contrib/xgboost/predict.py +16 -9
- maxframe/learn/contrib/xgboost/regressor.py +28 -27
- maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
- maxframe/learn/contrib/xgboost/train.py +59 -16
- maxframe/learn/core.py +252 -0
- maxframe/learn/datasets/__init__.py +20 -0
- maxframe/learn/datasets/samples_generator.py +628 -0
- maxframe/learn/linear_model/__init__.py +15 -0
- maxframe/learn/linear_model/_base.py +163 -0
- maxframe/learn/linear_model/_lin_reg.py +175 -0
- maxframe/learn/metrics/__init__.py +25 -0
- maxframe/learn/metrics/_check_targets.py +95 -0
- maxframe/learn/metrics/_classification.py +1121 -0
- maxframe/learn/metrics/_regression.py +256 -0
- maxframe/learn/model_selection/__init__.py +15 -0
- maxframe/learn/model_selection/_split.py +451 -0
- maxframe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/learn/model_selection/tests/test_split.py +156 -0
- maxframe/learn/preprocessing/__init__.py +16 -0
- maxframe/learn/preprocessing/_data/__init__.py +17 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
- maxframe/learn/preprocessing/_data/normalize.py +127 -0
- maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
- maxframe/learn/preprocessing/_data/utils.py +79 -0
- maxframe/learn/preprocessing/_label/__init__.py +16 -0
- maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
- maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
- maxframe/learn/utils/__init__.py +4 -0
- maxframe/learn/utils/_encode.py +314 -0
- maxframe/learn/utils/checks.py +161 -0
- maxframe/learn/utils/core.py +33 -0
- maxframe/learn/utils/extmath.py +176 -0
- maxframe/learn/utils/multiclass.py +292 -0
- maxframe/learn/utils/shuffle.py +114 -0
- maxframe/learn/utils/sparsefuncs.py +87 -0
- maxframe/learn/utils/validation.py +775 -0
- maxframe/lib/__init__.py +0 -2
- maxframe/lib/compat.py +145 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/mmh3.cp39-win32.pyd +0 -0
- maxframe/lib/sparse/__init__.py +10 -15
- maxframe/lib/sparse/array.py +45 -33
- maxframe/lib/sparse/core.py +0 -2
- maxframe/lib/sparse/linalg.py +31 -0
- maxframe/lib/sparse/matrix.py +5 -2
- maxframe/lib/sparse/tests/__init__.py +0 -2
- maxframe/lib/sparse/tests/test_sparse.py +53 -53
- maxframe/lib/sparse/vector.py +0 -2
- maxframe/mixin.py +59 -2
- maxframe/opcodes.py +13 -5
- maxframe/protocol.py +67 -14
- maxframe/remote/core.py +16 -14
- maxframe/remote/run_script.py +6 -3
- maxframe/serialization/__init__.py +2 -0
- maxframe/serialization/core.cp39-win32.pyd +0 -0
- maxframe/serialization/core.pxd +3 -0
- maxframe/serialization/core.pyi +3 -1
- maxframe/serialization/core.pyx +82 -4
- maxframe/serialization/pandas.py +5 -1
- maxframe/serialization/serializables/core.py +6 -5
- maxframe/serialization/serializables/field.py +2 -2
- maxframe/serialization/serializables/tests/test_field_type.py +3 -5
- maxframe/serialization/tests/test_serial.py +27 -0
- maxframe/session.py +4 -71
- maxframe/sperunner.py +165 -0
- maxframe/tensor/__init__.py +35 -2
- maxframe/tensor/arithmetic/__init__.py +2 -4
- maxframe/tensor/arithmetic/abs.py +0 -2
- maxframe/tensor/arithmetic/absolute.py +0 -2
- maxframe/tensor/arithmetic/add.py +34 -4
- maxframe/tensor/arithmetic/angle.py +0 -2
- maxframe/tensor/arithmetic/arccos.py +1 -4
- maxframe/tensor/arithmetic/arccosh.py +1 -3
- maxframe/tensor/arithmetic/arcsin.py +0 -2
- maxframe/tensor/arithmetic/arcsinh.py +0 -2
- maxframe/tensor/arithmetic/arctan.py +0 -2
- maxframe/tensor/arithmetic/arctan2.py +0 -2
- maxframe/tensor/arithmetic/arctanh.py +0 -2
- maxframe/tensor/arithmetic/around.py +0 -2
- maxframe/tensor/arithmetic/bitand.py +0 -2
- maxframe/tensor/arithmetic/bitor.py +1 -3
- maxframe/tensor/arithmetic/bitxor.py +1 -3
- maxframe/tensor/arithmetic/cbrt.py +0 -2
- maxframe/tensor/arithmetic/ceil.py +0 -2
- maxframe/tensor/arithmetic/clip.py +13 -13
- maxframe/tensor/arithmetic/conj.py +0 -2
- maxframe/tensor/arithmetic/copysign.py +0 -2
- maxframe/tensor/arithmetic/core.py +47 -39
- maxframe/tensor/arithmetic/cos.py +1 -3
- maxframe/tensor/arithmetic/cosh.py +0 -2
- maxframe/tensor/arithmetic/deg2rad.py +0 -2
- maxframe/tensor/arithmetic/degrees.py +0 -2
- maxframe/tensor/arithmetic/divide.py +0 -2
- maxframe/tensor/arithmetic/equal.py +0 -2
- maxframe/tensor/arithmetic/exp.py +1 -3
- maxframe/tensor/arithmetic/exp2.py +0 -2
- maxframe/tensor/arithmetic/expm1.py +0 -2
- maxframe/tensor/arithmetic/fabs.py +0 -2
- maxframe/tensor/arithmetic/fix.py +0 -2
- maxframe/tensor/arithmetic/float_power.py +0 -2
- maxframe/tensor/arithmetic/floor.py +0 -2
- maxframe/tensor/arithmetic/floordiv.py +0 -2
- maxframe/tensor/arithmetic/fmax.py +0 -2
- maxframe/tensor/arithmetic/fmin.py +0 -2
- maxframe/tensor/arithmetic/fmod.py +0 -2
- maxframe/tensor/arithmetic/frexp.py +6 -2
- maxframe/tensor/arithmetic/greater.py +0 -2
- maxframe/tensor/arithmetic/greater_equal.py +0 -2
- maxframe/tensor/arithmetic/hypot.py +0 -2
- maxframe/tensor/arithmetic/i0.py +1 -3
- maxframe/tensor/arithmetic/imag.py +0 -2
- maxframe/tensor/arithmetic/invert.py +1 -3
- maxframe/tensor/arithmetic/isclose.py +0 -2
- maxframe/tensor/arithmetic/iscomplex.py +0 -2
- maxframe/tensor/arithmetic/isfinite.py +1 -3
- maxframe/tensor/arithmetic/isinf.py +0 -2
- maxframe/tensor/arithmetic/isnan.py +0 -2
- maxframe/tensor/arithmetic/isreal.py +0 -2
- maxframe/tensor/arithmetic/ldexp.py +0 -2
- maxframe/tensor/arithmetic/less.py +0 -2
- maxframe/tensor/arithmetic/less_equal.py +0 -2
- maxframe/tensor/arithmetic/log.py +1 -3
- maxframe/tensor/arithmetic/log10.py +1 -3
- maxframe/tensor/arithmetic/log1p.py +1 -3
- maxframe/tensor/arithmetic/log2.py +1 -3
- maxframe/tensor/arithmetic/logaddexp.py +0 -2
- maxframe/tensor/arithmetic/logaddexp2.py +0 -2
- maxframe/tensor/arithmetic/logical_and.py +0 -2
- maxframe/tensor/arithmetic/logical_not.py +1 -3
- maxframe/tensor/arithmetic/logical_or.py +0 -2
- maxframe/tensor/arithmetic/logical_xor.py +0 -2
- maxframe/tensor/arithmetic/lshift.py +0 -2
- maxframe/tensor/arithmetic/maximum.py +0 -2
- maxframe/tensor/arithmetic/minimum.py +0 -2
- maxframe/tensor/arithmetic/mod.py +0 -2
- maxframe/tensor/arithmetic/modf.py +6 -2
- maxframe/tensor/arithmetic/multiply.py +37 -4
- maxframe/tensor/arithmetic/nan_to_num.py +0 -2
- maxframe/tensor/arithmetic/negative.py +0 -2
- maxframe/tensor/arithmetic/nextafter.py +0 -2
- maxframe/tensor/arithmetic/not_equal.py +0 -2
- maxframe/tensor/arithmetic/positive.py +0 -2
- maxframe/tensor/arithmetic/power.py +0 -2
- maxframe/tensor/arithmetic/rad2deg.py +0 -2
- maxframe/tensor/arithmetic/radians.py +0 -2
- maxframe/tensor/arithmetic/real.py +0 -2
- maxframe/tensor/arithmetic/reciprocal.py +5 -3
- maxframe/tensor/arithmetic/rint.py +1 -3
- maxframe/tensor/arithmetic/rshift.py +0 -2
- maxframe/tensor/arithmetic/setimag.py +0 -2
- maxframe/tensor/arithmetic/setreal.py +0 -2
- maxframe/tensor/arithmetic/sign.py +0 -2
- maxframe/tensor/arithmetic/signbit.py +0 -2
- maxframe/tensor/arithmetic/sin.py +0 -2
- maxframe/tensor/arithmetic/sinc.py +1 -3
- maxframe/tensor/arithmetic/sinh.py +0 -2
- maxframe/tensor/arithmetic/spacing.py +0 -2
- maxframe/tensor/arithmetic/sqrt.py +0 -2
- maxframe/tensor/arithmetic/square.py +0 -2
- maxframe/tensor/arithmetic/subtract.py +4 -2
- maxframe/tensor/arithmetic/tan.py +0 -2
- maxframe/tensor/arithmetic/tanh.py +0 -2
- maxframe/tensor/arithmetic/tests/__init__.py +0 -2
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
- maxframe/tensor/arithmetic/truediv.py +0 -2
- maxframe/tensor/arithmetic/trunc.py +0 -2
- maxframe/tensor/arithmetic/utils.py +32 -6
- maxframe/tensor/array_utils.py +3 -25
- maxframe/tensor/core.py +6 -6
- maxframe/tensor/datasource/__init__.py +10 -2
- maxframe/tensor/datasource/arange.py +0 -2
- maxframe/tensor/datasource/array.py +3 -22
- maxframe/tensor/datasource/core.py +15 -10
- maxframe/tensor/datasource/diag.py +140 -0
- maxframe/tensor/datasource/diagflat.py +69 -0
- maxframe/tensor/datasource/empty.py +0 -2
- maxframe/tensor/datasource/eye.py +95 -0
- maxframe/tensor/datasource/from_dataframe.py +0 -2
- maxframe/tensor/datasource/from_dense.py +0 -17
- maxframe/tensor/datasource/from_sparse.py +0 -2
- maxframe/tensor/datasource/full.py +0 -2
- maxframe/tensor/datasource/identity.py +54 -0
- maxframe/tensor/datasource/indices.py +115 -0
- maxframe/tensor/datasource/linspace.py +140 -0
- maxframe/tensor/datasource/meshgrid.py +135 -0
- maxframe/tensor/datasource/ones.py +8 -3
- maxframe/tensor/datasource/tests/test_datasource.py +32 -1
- maxframe/tensor/datasource/tri_array.py +107 -0
- maxframe/tensor/datasource/zeros.py +7 -3
- maxframe/tensor/extensions/__init__.py +31 -0
- maxframe/tensor/extensions/accessor.py +25 -0
- maxframe/tensor/extensions/apply_chunk.py +137 -0
- maxframe/tensor/indexing/__init__.py +1 -1
- maxframe/tensor/indexing/choose.py +8 -6
- maxframe/tensor/indexing/compress.py +0 -2
- maxframe/tensor/indexing/extract.py +0 -2
- maxframe/tensor/indexing/fill_diagonal.py +9 -6
- maxframe/tensor/indexing/flatnonzero.py +1 -3
- maxframe/tensor/indexing/getitem.py +10 -43
- maxframe/tensor/indexing/nonzero.py +2 -4
- maxframe/tensor/indexing/setitem.py +19 -9
- maxframe/tensor/indexing/slice.py +6 -3
- maxframe/tensor/indexing/take.py +0 -2
- maxframe/tensor/indexing/tests/__init__.py +0 -2
- maxframe/tensor/indexing/tests/test_indexing.py +0 -2
- maxframe/tensor/indexing/unravel_index.py +6 -6
- maxframe/tensor/lib/__init__.py +16 -0
- maxframe/tensor/lib/index_tricks.py +404 -0
- maxframe/tensor/linalg/__init__.py +36 -0
- maxframe/tensor/linalg/dot.py +145 -0
- maxframe/tensor/linalg/inner.py +36 -0
- maxframe/tensor/linalg/inv.py +83 -0
- maxframe/tensor/linalg/lu.py +115 -0
- maxframe/tensor/linalg/matmul.py +225 -0
- maxframe/tensor/linalg/qr.py +124 -0
- maxframe/tensor/linalg/solve_triangular.py +103 -0
- maxframe/tensor/linalg/svd.py +167 -0
- maxframe/tensor/linalg/tensordot.py +213 -0
- maxframe/tensor/linalg/vdot.py +73 -0
- maxframe/tensor/merge/__init__.py +4 -0
- maxframe/tensor/merge/append.py +74 -0
- maxframe/tensor/merge/column_stack.py +63 -0
- maxframe/tensor/merge/concatenate.py +3 -2
- maxframe/tensor/merge/dstack.py +71 -0
- maxframe/tensor/merge/hstack.py +70 -0
- maxframe/tensor/merge/stack.py +0 -2
- maxframe/tensor/merge/tests/test_merge.py +0 -2
- maxframe/tensor/misc/__init__.py +18 -5
- maxframe/tensor/misc/astype.py +10 -8
- maxframe/tensor/misc/broadcast_to.py +1 -1
- maxframe/tensor/misc/copy.py +64 -0
- maxframe/tensor/misc/diff.py +115 -0
- maxframe/tensor/misc/flatten.py +63 -0
- maxframe/tensor/misc/in1d.py +94 -0
- maxframe/tensor/misc/isin.py +130 -0
- maxframe/tensor/misc/ndim.py +53 -0
- maxframe/tensor/misc/ravel.py +0 -2
- maxframe/tensor/misc/repeat.py +129 -0
- maxframe/tensor/misc/searchsorted.py +147 -0
- maxframe/tensor/misc/setdiff1d.py +58 -0
- maxframe/tensor/misc/squeeze.py +117 -0
- maxframe/tensor/misc/swapaxes.py +113 -0
- maxframe/tensor/misc/tests/test_misc.py +0 -2
- maxframe/tensor/misc/transpose.py +8 -4
- maxframe/tensor/misc/trapezoid.py +123 -0
- maxframe/tensor/misc/unique.py +0 -1
- maxframe/tensor/misc/where.py +10 -8
- maxframe/tensor/operators.py +0 -34
- maxframe/tensor/random/__init__.py +3 -5
- maxframe/tensor/random/binomial.py +0 -2
- maxframe/tensor/random/bytes.py +0 -2
- maxframe/tensor/random/chisquare.py +0 -2
- maxframe/tensor/random/choice.py +9 -8
- maxframe/tensor/random/core.py +20 -5
- maxframe/tensor/random/dirichlet.py +0 -2
- maxframe/tensor/random/exponential.py +0 -2
- maxframe/tensor/random/f.py +2 -4
- maxframe/tensor/random/gamma.py +0 -2
- maxframe/tensor/random/geometric.py +0 -2
- maxframe/tensor/random/gumbel.py +0 -2
- maxframe/tensor/random/hypergeometric.py +0 -2
- maxframe/tensor/random/laplace.py +2 -4
- maxframe/tensor/random/logistic.py +0 -2
- maxframe/tensor/random/lognormal.py +0 -2
- maxframe/tensor/random/logseries.py +0 -2
- maxframe/tensor/random/multinomial.py +0 -2
- maxframe/tensor/random/multivariate_normal.py +0 -2
- maxframe/tensor/random/negative_binomial.py +0 -2
- maxframe/tensor/random/noncentral_chisquare.py +0 -2
- maxframe/tensor/random/noncentral_f.py +1 -3
- maxframe/tensor/random/normal.py +0 -2
- maxframe/tensor/random/pareto.py +0 -2
- maxframe/tensor/random/permutation.py +6 -3
- maxframe/tensor/random/poisson.py +0 -2
- maxframe/tensor/random/power.py +0 -2
- maxframe/tensor/random/rand.py +0 -2
- maxframe/tensor/random/randint.py +0 -2
- maxframe/tensor/random/randn.py +0 -2
- maxframe/tensor/random/random_integers.py +0 -2
- maxframe/tensor/random/random_sample.py +0 -2
- maxframe/tensor/random/rayleigh.py +0 -2
- maxframe/tensor/random/standard_cauchy.py +0 -2
- maxframe/tensor/random/standard_exponential.py +0 -2
- maxframe/tensor/random/standard_gamma.py +0 -2
- maxframe/tensor/random/standard_normal.py +0 -2
- maxframe/tensor/random/standard_t.py +0 -2
- maxframe/tensor/random/tests/__init__.py +0 -2
- maxframe/tensor/random/tests/test_random.py +0 -2
- maxframe/tensor/random/triangular.py +0 -2
- maxframe/tensor/random/uniform.py +0 -2
- maxframe/tensor/random/vonmises.py +0 -2
- maxframe/tensor/random/wald.py +0 -2
- maxframe/tensor/random/weibull.py +0 -2
- maxframe/tensor/random/zipf.py +0 -2
- maxframe/tensor/reduction/__init__.py +0 -2
- maxframe/tensor/reduction/all.py +0 -2
- maxframe/tensor/reduction/allclose.py +0 -2
- maxframe/tensor/reduction/any.py +0 -2
- maxframe/tensor/reduction/argmax.py +1 -3
- maxframe/tensor/reduction/argmin.py +1 -3
- maxframe/tensor/reduction/array_equal.py +0 -2
- maxframe/tensor/reduction/core.py +0 -2
- maxframe/tensor/reduction/count_nonzero.py +0 -2
- maxframe/tensor/reduction/cumprod.py +0 -2
- maxframe/tensor/reduction/cumsum.py +0 -2
- maxframe/tensor/reduction/max.py +0 -2
- maxframe/tensor/reduction/mean.py +0 -2
- maxframe/tensor/reduction/min.py +0 -2
- maxframe/tensor/reduction/nanargmax.py +0 -2
- maxframe/tensor/reduction/nanargmin.py +0 -2
- maxframe/tensor/reduction/nancumprod.py +0 -2
- maxframe/tensor/reduction/nancumsum.py +0 -2
- maxframe/tensor/reduction/nanmax.py +0 -2
- maxframe/tensor/reduction/nanmean.py +0 -2
- maxframe/tensor/reduction/nanmin.py +0 -2
- maxframe/tensor/reduction/nanprod.py +0 -2
- maxframe/tensor/reduction/nanstd.py +0 -2
- maxframe/tensor/reduction/nansum.py +0 -2
- maxframe/tensor/reduction/nanvar.py +0 -2
- maxframe/tensor/reduction/prod.py +0 -2
- maxframe/tensor/reduction/std.py +0 -2
- maxframe/tensor/reduction/sum.py +0 -2
- maxframe/tensor/reduction/tests/test_reduction.py +1 -4
- maxframe/tensor/reduction/var.py +0 -2
- maxframe/tensor/reshape/__init__.py +0 -2
- maxframe/tensor/reshape/reshape.py +6 -5
- maxframe/tensor/reshape/tests/__init__.py +0 -2
- maxframe/tensor/reshape/tests/test_reshape.py +0 -2
- maxframe/tensor/sort/__init__.py +16 -0
- maxframe/tensor/sort/argsort.py +150 -0
- maxframe/tensor/sort/sort.py +295 -0
- maxframe/tensor/special/__init__.py +37 -0
- maxframe/tensor/special/core.py +38 -0
- maxframe/tensor/special/misc.py +142 -0
- maxframe/tensor/special/statistical.py +56 -0
- maxframe/tensor/statistics/__init__.py +5 -0
- maxframe/tensor/statistics/average.py +143 -0
- maxframe/tensor/statistics/bincount.py +133 -0
- maxframe/tensor/statistics/quantile.py +10 -8
- maxframe/tensor/ufunc/__init__.py +0 -2
- maxframe/tensor/ufunc/ufunc.py +0 -2
- maxframe/tensor/utils.py +21 -3
- maxframe/tests/test_protocol.py +3 -3
- maxframe/tests/test_utils.py +210 -1
- maxframe/tests/utils.py +67 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +4 -1
- maxframe-2.0.0b1.dist-info/RECORD +939 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +1 -1
- maxframe_client/clients/framedriver.py +19 -3
- maxframe_client/fetcher.py +113 -6
- maxframe_client/session/odps.py +173 -38
- maxframe_client/session/task.py +3 -1
- maxframe_client/tests/test_session.py +41 -5
- maxframe-1.3.1.dist-info/RECORD +0 -705
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ... import opcodes
|
|
18
|
+
from ...core import ExecutableTuple
|
|
19
|
+
from ...serialization.serializables import AnyField, BoolField, Int64Field
|
|
20
|
+
from .core import TensorNoInput
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TensorLinspace(TensorNoInput):
|
|
24
|
+
_op_type_ = opcodes.TENSOR_LINSPACE
|
|
25
|
+
|
|
26
|
+
start = AnyField("start")
|
|
27
|
+
stop = AnyField("stop")
|
|
28
|
+
num = Int64Field("num")
|
|
29
|
+
endpoint = BoolField("endpoint")
|
|
30
|
+
|
|
31
|
+
def __init__(self, dtype=None, **kw):
|
|
32
|
+
dtype = np.dtype(np.linspace(0, 1, 1).dtype if dtype is None else dtype)
|
|
33
|
+
super().__init__(dtype=dtype, **kw)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def linspace(
|
|
37
|
+
start,
|
|
38
|
+
stop,
|
|
39
|
+
num=50,
|
|
40
|
+
endpoint=True,
|
|
41
|
+
retstep=False,
|
|
42
|
+
dtype=None,
|
|
43
|
+
gpu=None,
|
|
44
|
+
chunk_size=None,
|
|
45
|
+
):
|
|
46
|
+
"""
|
|
47
|
+
Return evenly spaced numbers over a specified interval.
|
|
48
|
+
|
|
49
|
+
Returns `num` evenly spaced samples, calculated over the
|
|
50
|
+
interval [`start`, `stop`].
|
|
51
|
+
|
|
52
|
+
The endpoint of the interval can optionally be excluded.
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
start : scalar
|
|
57
|
+
The starting value of the sequence.
|
|
58
|
+
stop : scalar
|
|
59
|
+
The end value of the sequence, unless `endpoint` is set to False.
|
|
60
|
+
In that case, the sequence consists of all but the last of ``num + 1``
|
|
61
|
+
evenly spaced samples, so that `stop` is excluded. Note that the step
|
|
62
|
+
size changes when `endpoint` is False.
|
|
63
|
+
num : int, optional
|
|
64
|
+
Number of samples to generate. Default is 50. Must be non-negative.
|
|
65
|
+
endpoint : bool, optional
|
|
66
|
+
If True, `stop` is the last sample. Otherwise, it is not included.
|
|
67
|
+
Default is True.
|
|
68
|
+
retstep : bool, optional
|
|
69
|
+
If True, return (`samples`, `step`), where `step` is the spacing
|
|
70
|
+
between samples.
|
|
71
|
+
dtype : dtype, optional
|
|
72
|
+
The type of the output tensor. If `dtype` is not given, infer the data
|
|
73
|
+
type from the other input arguments.
|
|
74
|
+
gpu : bool, optional
|
|
75
|
+
Allocate the tensor on GPU if True, False as default
|
|
76
|
+
chunk_size : int or tuple of int or tuple of ints, optional
|
|
77
|
+
Desired chunk size on each dimension
|
|
78
|
+
|
|
79
|
+
Returns
|
|
80
|
+
-------
|
|
81
|
+
samples : Tensor
|
|
82
|
+
There are `num` equally spaced samples in the closed interval
|
|
83
|
+
``[start, stop]`` or the half-open interval ``[start, stop)``
|
|
84
|
+
(depending on whether `endpoint` is True or False).
|
|
85
|
+
step : float, optional
|
|
86
|
+
Only returned if `retstep` is True
|
|
87
|
+
|
|
88
|
+
Size of spacing between samples.
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
See Also
|
|
92
|
+
--------
|
|
93
|
+
arange : Similar to `linspace`, but uses a step size (instead of the
|
|
94
|
+
number of samples).
|
|
95
|
+
logspace : Samples uniformly distributed in log space.
|
|
96
|
+
|
|
97
|
+
Examples
|
|
98
|
+
--------
|
|
99
|
+
>>> import maxframe.tensor as mt
|
|
100
|
+
|
|
101
|
+
>>> mt.linspace(2.0, 3.0, num=5).execute()
|
|
102
|
+
array([ 2. , 2.25, 2.5 , 2.75, 3. ])
|
|
103
|
+
>>> mt.linspace(2.0, 3.0, num=5, endpoint=False).execute()
|
|
104
|
+
array([ 2. , 2.2, 2.4, 2.6, 2.8])
|
|
105
|
+
>>> mt.linspace(2.0, 3.0, num=5, retstep=True).execute()
|
|
106
|
+
(array([ 2. , 2.25, 2.5 , 2.75, 3. ]), 0.25)
|
|
107
|
+
|
|
108
|
+
Graphical illustration:
|
|
109
|
+
|
|
110
|
+
>>> import matplotlib.pyplot as plt
|
|
111
|
+
>>> N = 8
|
|
112
|
+
>>> y = mt.zeros(N)
|
|
113
|
+
>>> x1 = mt.linspace(0, 10, N, endpoint=True)
|
|
114
|
+
>>> x2 = mt.linspace(0, 10, N, endpoint=False)
|
|
115
|
+
>>> plt.plot(x1.execute(), y.execute(), 'o')
|
|
116
|
+
[<matplotlib.lines.Line2D object at 0x...>]
|
|
117
|
+
>>> plt.plot(x2.execute(), y.execute() + 0.5, 'o')
|
|
118
|
+
[<matplotlib.lines.Line2D object at 0x...>]
|
|
119
|
+
>>> plt.ylim([-0.5, 1])
|
|
120
|
+
(-0.5, 1)
|
|
121
|
+
>>> plt.show()
|
|
122
|
+
|
|
123
|
+
"""
|
|
124
|
+
num = int(num)
|
|
125
|
+
|
|
126
|
+
op = TensorLinspace(
|
|
127
|
+
start=start, stop=stop, num=num, endpoint=endpoint, dtype=dtype, gpu=gpu
|
|
128
|
+
)
|
|
129
|
+
shape = (num,)
|
|
130
|
+
ret = op(shape, chunk_size=chunk_size)
|
|
131
|
+
|
|
132
|
+
if not retstep:
|
|
133
|
+
return ret
|
|
134
|
+
|
|
135
|
+
if num > 1:
|
|
136
|
+
step = float(stop - start) / (num if not endpoint else num - 1)
|
|
137
|
+
else:
|
|
138
|
+
step = np.nan
|
|
139
|
+
|
|
140
|
+
return ExecutableTuple([ret, step])
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .array import tensor
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def meshgrid(*xi, **kwargs):
|
|
19
|
+
"""
|
|
20
|
+
Return coordinate matrices from coordinate vectors.
|
|
21
|
+
|
|
22
|
+
Make N-D coordinate arrays for vectorized evaluations of
|
|
23
|
+
N-D scalar/vector fields over N-D grids, given
|
|
24
|
+
one-dimensional coordinate tensors x1, x2,..., xn.
|
|
25
|
+
|
|
26
|
+
Parameters
|
|
27
|
+
----------
|
|
28
|
+
x1, x2,..., xn : array_like
|
|
29
|
+
1-D arrays representing the coordinates of a grid.
|
|
30
|
+
indexing : {'xy', 'ij'}, optional
|
|
31
|
+
Cartesian ('xy', default) or matrix ('ij') indexing of output.
|
|
32
|
+
See Notes for more details.
|
|
33
|
+
sparse : bool, optional
|
|
34
|
+
If True a sparse grid is returned in order to conserve memory.
|
|
35
|
+
Default is False.
|
|
36
|
+
|
|
37
|
+
Returns
|
|
38
|
+
-------
|
|
39
|
+
X1, X2,..., XN : Tensor
|
|
40
|
+
For vectors `x1`, `x2`,..., 'xn' with lengths ``Ni=len(xi)`` ,
|
|
41
|
+
return ``(N1, N2, N3,...Nn)`` shaped tensors if indexing='ij'
|
|
42
|
+
or ``(N2, N1, N3,...Nn)`` shaped tensors if indexing='xy'
|
|
43
|
+
with the elements of `xi` repeated to fill the matrix along
|
|
44
|
+
the first dimension for `x1`, the second for `x2` and so on.
|
|
45
|
+
|
|
46
|
+
Notes
|
|
47
|
+
-----
|
|
48
|
+
This function supports both indexing conventions through the indexing
|
|
49
|
+
keyword argument. Giving the string 'ij' returns a meshgrid with
|
|
50
|
+
matrix indexing, while 'xy' returns a meshgrid with Cartesian indexing.
|
|
51
|
+
In the 2-D case with inputs of length M and N, the outputs are of shape
|
|
52
|
+
(N, M) for 'xy' indexing and (M, N) for 'ij' indexing. In the 3-D case
|
|
53
|
+
with inputs of length M, N and P, outputs are of shape (N, M, P) for
|
|
54
|
+
'xy' indexing and (M, N, P) for 'ij' indexing. The difference is
|
|
55
|
+
illustrated by the following code snippet::
|
|
56
|
+
|
|
57
|
+
xv, yv = mt.meshgrid(x, y, sparse=False, indexing='ij')
|
|
58
|
+
for i in range(nx):
|
|
59
|
+
for j in range(ny):
|
|
60
|
+
# treat xv[i,j], yv[i,j]
|
|
61
|
+
|
|
62
|
+
xv, yv = mt.meshgrid(x, y, sparse=False, indexing='xy')
|
|
63
|
+
for i in range(nx):
|
|
64
|
+
for j in range(ny):
|
|
65
|
+
# treat xv[j,i], yv[j,i]
|
|
66
|
+
|
|
67
|
+
In the 1-D and 0-D case, the indexing and sparse keywords have no effect.
|
|
68
|
+
|
|
69
|
+
Examples
|
|
70
|
+
--------
|
|
71
|
+
>>> import maxframe.tensor as mt
|
|
72
|
+
|
|
73
|
+
>>> nx, ny = (3, 2)
|
|
74
|
+
>>> x = mt.linspace(0, 1, nx)
|
|
75
|
+
>>> y = mt.linspace(0, 1, ny)
|
|
76
|
+
>>> xv, yv = mt.meshgrid(x, y)
|
|
77
|
+
>>> xv.execute()
|
|
78
|
+
array([[ 0. , 0.5, 1. ],
|
|
79
|
+
[ 0. , 0.5, 1. ]])
|
|
80
|
+
>>> yv.execute()
|
|
81
|
+
array([[ 0., 0., 0.],
|
|
82
|
+
[ 1., 1., 1.]])
|
|
83
|
+
>>> xv, yv = mt.meshgrid(x, y, sparse=True) # make sparse output arrays
|
|
84
|
+
>>> xv.execute()
|
|
85
|
+
array([[ 0. , 0.5, 1. ]])
|
|
86
|
+
>>> yv.execute()
|
|
87
|
+
array([[ 0.],
|
|
88
|
+
[ 1.]])
|
|
89
|
+
|
|
90
|
+
`meshgrid` is very useful to evaluate functions on a grid.
|
|
91
|
+
|
|
92
|
+
>>> import matplotlib.pyplot as plt
|
|
93
|
+
>>> x = mt.arange(-5, 5, 0.1)
|
|
94
|
+
>>> y = mt.arange(-5, 5, 0.1)
|
|
95
|
+
>>> xx, yy = mt.meshgrid(x, y, sparse=True)
|
|
96
|
+
>>> z = mt.sin(xx**2 + yy**2) / (xx**2 + yy**2)
|
|
97
|
+
>>> h = plt.contourf(x,y,z)
|
|
98
|
+
|
|
99
|
+
"""
|
|
100
|
+
from ..misc import broadcast_to
|
|
101
|
+
|
|
102
|
+
indexing = kwargs.pop("indexing", "xy")
|
|
103
|
+
sparse = kwargs.pop("sparse", False)
|
|
104
|
+
|
|
105
|
+
if kwargs:
|
|
106
|
+
raise TypeError(
|
|
107
|
+
f"meshgrid() got an unexpected keyword argument '{list(kwargs)[0]}'"
|
|
108
|
+
)
|
|
109
|
+
if indexing not in ("xy", "ij"):
|
|
110
|
+
raise ValueError("Valid values for `indexing` are 'xy' and 'ij'.")
|
|
111
|
+
|
|
112
|
+
xi = [tensor(x) for x in xi]
|
|
113
|
+
xi = [a.ravel() for a in xi]
|
|
114
|
+
shape = [x.size for x in xi]
|
|
115
|
+
|
|
116
|
+
if indexing == "xy" and len(xi) > 1:
|
|
117
|
+
xi[0], xi[1] = xi[1], xi[0]
|
|
118
|
+
shape[0], shape[1] = shape[1], shape[0]
|
|
119
|
+
|
|
120
|
+
grid = []
|
|
121
|
+
for i, x in enumerate(xi):
|
|
122
|
+
slc = [None] * len(shape)
|
|
123
|
+
slc[i] = slice(None)
|
|
124
|
+
|
|
125
|
+
r = x[tuple(slc)]
|
|
126
|
+
|
|
127
|
+
if not sparse:
|
|
128
|
+
r = broadcast_to(r, shape)
|
|
129
|
+
|
|
130
|
+
grid.append(r)
|
|
131
|
+
|
|
132
|
+
if indexing == "xy" and len(xi) > 1:
|
|
133
|
+
grid[0], grid[1] = grid[1], grid[0]
|
|
134
|
+
|
|
135
|
+
return grid
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -24,6 +22,7 @@ from ...serialization.serializables import (
|
|
|
24
22
|
StringField,
|
|
25
23
|
TupleField,
|
|
26
24
|
)
|
|
25
|
+
from ...utils import on_deserialize_shape, on_serialize_shape
|
|
27
26
|
from ..utils import get_order
|
|
28
27
|
from .array import tensor
|
|
29
28
|
from .core import TensorLike, TensorNoInput
|
|
@@ -33,7 +32,12 @@ class TensorOnes(TensorNoInput):
|
|
|
33
32
|
_op_type_ = opcodes.TENSOR_ONES
|
|
34
33
|
|
|
35
34
|
order = StringField("order")
|
|
36
|
-
shape = TupleField(
|
|
35
|
+
shape = TupleField(
|
|
36
|
+
"shape",
|
|
37
|
+
FieldTypes.int64,
|
|
38
|
+
on_serialize=on_serialize_shape,
|
|
39
|
+
on_deserialize=on_deserialize_shape,
|
|
40
|
+
)
|
|
37
41
|
chunk_size = AnyField("chunk_size")
|
|
38
42
|
|
|
39
43
|
def __init__(self, shape=None, **kwargs):
|
|
@@ -108,6 +112,7 @@ class TensorOnesLike(TensorLike):
|
|
|
108
112
|
_op_type_ = opcodes.TENSOR_ONES_LIKE
|
|
109
113
|
|
|
110
114
|
_input = KeyField("input")
|
|
115
|
+
order = StringField("order")
|
|
111
116
|
|
|
112
117
|
def __init__(self, dtype=None, sparse=False, **kw):
|
|
113
118
|
dtype = np.dtype(dtype) if dtype is not None else None
|
|
@@ -20,7 +20,7 @@ import scipy.sparse as sps
|
|
|
20
20
|
|
|
21
21
|
from .... import dataframe as md
|
|
22
22
|
from ....core import enter_mode
|
|
23
|
-
from ... import arange, full, ones, ones_like, tensor, zeros
|
|
23
|
+
from ... import arange, diag, full, ones, ones_like, tensor, zeros
|
|
24
24
|
from ...core import SparseTensor, Tensor
|
|
25
25
|
from .. import array, asarray, ascontiguousarray, asfortranarray, fromdense
|
|
26
26
|
from ..array import CSRMatrixDataSource
|
|
@@ -276,3 +276,34 @@ def test_from_dataframe():
|
|
|
276
276
|
tensor = from_dataframe(mdf)
|
|
277
277
|
assert tensor.shape == (3, 3)
|
|
278
278
|
assert np.float64 == tensor.dtype
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def test_diag():
|
|
282
|
+
# test 2-d, shape[0] == shape[1], k == 0
|
|
283
|
+
v = tensor(np.arange(16).reshape(4, 4), chunk_size=2)
|
|
284
|
+
t = diag(v)
|
|
285
|
+
assert t.shape == (4,)
|
|
286
|
+
|
|
287
|
+
v = tensor(np.arange(16).reshape(4, 4), chunk_size=(2, 3))
|
|
288
|
+
t = diag(v)
|
|
289
|
+
assert t.shape == (4,)
|
|
290
|
+
|
|
291
|
+
# test 1-d, k == 0
|
|
292
|
+
v = tensor(np.arange(3), chunk_size=2)
|
|
293
|
+
t = diag(v, sparse=True)
|
|
294
|
+
assert t.shape == (3, 3)
|
|
295
|
+
|
|
296
|
+
# test 2-d, shape[0] != shape[1]
|
|
297
|
+
v = tensor(np.arange(24).reshape(4, 6), chunk_size=2)
|
|
298
|
+
t = diag(v)
|
|
299
|
+
assert t.shape == np.diag(np.arange(24).reshape(4, 6)).shape
|
|
300
|
+
|
|
301
|
+
v = tensor(np.arange(24).reshape(4, 6), chunk_size=2)
|
|
302
|
+
t = diag(v, k=1)
|
|
303
|
+
assert t.shape == np.diag(np.arange(24).reshape(4, 6), k=1).shape
|
|
304
|
+
t = diag(v, k=2)
|
|
305
|
+
assert t.shape == np.diag(np.arange(24).reshape(4, 6), k=2).shape
|
|
306
|
+
t = diag(v, k=-1)
|
|
307
|
+
assert t.shape == np.diag(np.arange(24).reshape(4, 6), k=-1).shape
|
|
308
|
+
t = diag(v, k=-2)
|
|
309
|
+
assert t.shape == np.diag(np.arange(24).reshape(4, 6), k=-2).shape
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ... import opcodes
|
|
16
|
+
from ...serialization.serializables import Int32Field
|
|
17
|
+
from ..core import TensorOrder
|
|
18
|
+
from .array import tensor as astensor
|
|
19
|
+
from .core import TensorHasInput
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TensorTriArray(TensorHasInput):
|
|
23
|
+
k = Int32Field("k")
|
|
24
|
+
|
|
25
|
+
def __call__(self, m, order=None):
|
|
26
|
+
order = TensorOrder.C_ORDER if order is None else order
|
|
27
|
+
return self.new_tensor([m], shape=m.shape, order=order)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TensorTriu(TensorTriArray):
|
|
31
|
+
_op_type_ = opcodes.TENSOR_TRIU
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def triu(m, k=0, gpu=None):
|
|
35
|
+
"""
|
|
36
|
+
Upper triangle of a tensor.
|
|
37
|
+
|
|
38
|
+
Return a copy of a matrix with the elements below the `k`-th diagonal
|
|
39
|
+
zeroed.
|
|
40
|
+
|
|
41
|
+
Please refer to the documentation for `tril` for further details.
|
|
42
|
+
|
|
43
|
+
See Also
|
|
44
|
+
--------
|
|
45
|
+
tril : lower triangle of a tensor
|
|
46
|
+
|
|
47
|
+
Examples
|
|
48
|
+
--------
|
|
49
|
+
>>> import maxframe.tensor as mt
|
|
50
|
+
|
|
51
|
+
>>> mt.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1).execute()
|
|
52
|
+
array([[ 1, 2, 3],
|
|
53
|
+
[ 4, 5, 6],
|
|
54
|
+
[ 0, 8, 9],
|
|
55
|
+
[ 0, 0, 12]])
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
m = astensor(m)
|
|
59
|
+
gpu = m.op.gpu if gpu is None else gpu
|
|
60
|
+
op = TensorTriu(k=k, dtype=m.dtype, sparse=m.issparse(), gpu=gpu)
|
|
61
|
+
return op(m)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class TensorTril(TensorTriArray):
|
|
65
|
+
_op_type_ = opcodes.TENSOR_TRIL
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def tril(m, k=0, gpu=None):
|
|
69
|
+
"""
|
|
70
|
+
Lower triangle of a tensor.
|
|
71
|
+
|
|
72
|
+
Return a copy of a tensor with elements above the `k`-th diagonal zeroed.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
m : array_like, shape (M, N)
|
|
77
|
+
Input tensor.
|
|
78
|
+
k : int, optional
|
|
79
|
+
Diagonal above which to zero elements. `k = 0` (the default) is the
|
|
80
|
+
main diagonal, `k < 0` is below it and `k > 0` is above.
|
|
81
|
+
gpu : bool, optional
|
|
82
|
+
Allocate the tensor on GPU if True, None as default
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
tril : Tensor, shape (M, N)
|
|
87
|
+
Lower triangle of `m`, of same shape and data-type as `m`.
|
|
88
|
+
|
|
89
|
+
See Also
|
|
90
|
+
--------
|
|
91
|
+
triu : same thing, only for the upper triangle
|
|
92
|
+
|
|
93
|
+
Examples
|
|
94
|
+
--------
|
|
95
|
+
>>> import maxframe.tensor as mt
|
|
96
|
+
|
|
97
|
+
>>> mt.tril([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1).execute()
|
|
98
|
+
array([[ 0, 0, 0],
|
|
99
|
+
[ 4, 0, 0],
|
|
100
|
+
[ 7, 8, 0],
|
|
101
|
+
[10, 11, 12]])
|
|
102
|
+
|
|
103
|
+
"""
|
|
104
|
+
m = astensor(m)
|
|
105
|
+
gpu = m.op.gpu if gpu is None else gpu
|
|
106
|
+
op = TensorTril(k=k, dtype=m.dtype, sparse=m.issparse(), gpu=gpu)
|
|
107
|
+
return op(m)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -25,6 +23,7 @@ from ...serialization.serializables import (
|
|
|
25
23
|
StringField,
|
|
26
24
|
TupleField,
|
|
27
25
|
)
|
|
26
|
+
from ...utils import on_deserialize_shape, on_serialize_shape
|
|
28
27
|
from ..utils import get_order
|
|
29
28
|
from .array import tensor
|
|
30
29
|
from .core import TensorLike, TensorNoInput
|
|
@@ -34,7 +33,12 @@ class TensorZeros(TensorNoInput):
|
|
|
34
33
|
_op_type_ = opcodes.TENSOR_ZEROS
|
|
35
34
|
|
|
36
35
|
order = StringField("order")
|
|
37
|
-
shape = TupleField(
|
|
36
|
+
shape = TupleField(
|
|
37
|
+
"shape",
|
|
38
|
+
FieldTypes.int64,
|
|
39
|
+
on_serialize=on_serialize_shape,
|
|
40
|
+
on_deserialize=on_deserialize_shape,
|
|
41
|
+
)
|
|
38
42
|
chunk_size = AnyField("chunk_size")
|
|
39
43
|
|
|
40
44
|
def __init__(self, shape=None, **kwargs):
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ...core import CachedAccessor
|
|
16
|
+
from .accessor import TensorMaxFrameAccessor
|
|
17
|
+
from .apply_chunk import apply_chunk
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _install():
|
|
21
|
+
from ..core import TENSOR_TYPE
|
|
22
|
+
|
|
23
|
+
TensorMaxFrameAccessor._register("apply_chunk", apply_chunk)
|
|
24
|
+
|
|
25
|
+
if TensorMaxFrameAccessor._api_count:
|
|
26
|
+
for t in TENSOR_TYPE:
|
|
27
|
+
t.mf = CachedAccessor("mf", TensorMaxFrameAccessor)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
_install()
|
|
31
|
+
del _install
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from typing import TYPE_CHECKING
|
|
16
|
+
|
|
17
|
+
from ...core import BaseMaxFrameAccessor
|
|
18
|
+
|
|
19
|
+
if TYPE_CHECKING:
|
|
20
|
+
from ..core import Tensor
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TensorMaxFrameAccessor(BaseMaxFrameAccessor):
|
|
24
|
+
_obj: "Tensor"
|
|
25
|
+
_api_count: int = 0
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ... import opcodes
|
|
18
|
+
from ...core import ENTITY_TYPE
|
|
19
|
+
from ...serialization.serializables import (
|
|
20
|
+
BoolField,
|
|
21
|
+
DictField,
|
|
22
|
+
FunctionField,
|
|
23
|
+
TupleField,
|
|
24
|
+
)
|
|
25
|
+
from ...udf import BuiltinFunction
|
|
26
|
+
from ...utils import find_objects, quiet_stdio, replace_objects
|
|
27
|
+
from ..core import TensorOrder
|
|
28
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class TensorApplyChunk(TensorOperator, TensorOperatorMixin):
|
|
32
|
+
_op_type_ = opcodes.APPLY_CHUNK
|
|
33
|
+
|
|
34
|
+
func = FunctionField("func")
|
|
35
|
+
elementwise = BoolField("elementwise")
|
|
36
|
+
args = TupleField("args")
|
|
37
|
+
kwargs = DictField("kwargs")
|
|
38
|
+
with_chunk_index = BoolField("with_chunk_index")
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def _set_inputs(cls, op: "TensorApplyChunk", inputs):
|
|
42
|
+
super()._set_inputs(op, inputs)
|
|
43
|
+
old_inputs = find_objects(op.args, ENTITY_TYPE) + find_objects(
|
|
44
|
+
op.kwargs, ENTITY_TYPE
|
|
45
|
+
)
|
|
46
|
+
mapping = {o: n for o, n in zip(old_inputs, op._inputs[1:])}
|
|
47
|
+
op.args = replace_objects(op.args, mapping)
|
|
48
|
+
op.kwargs = replace_objects(op.kwargs, mapping)
|
|
49
|
+
|
|
50
|
+
def has_custom_code(self) -> bool:
|
|
51
|
+
return not isinstance(self.func, BuiltinFunction)
|
|
52
|
+
|
|
53
|
+
def __call__(self, t, dtype=None, shape=None, order=None):
|
|
54
|
+
if dtype is None:
|
|
55
|
+
try:
|
|
56
|
+
kwargs = self.kwargs or dict()
|
|
57
|
+
if self.with_chunk_index:
|
|
58
|
+
kwargs["chunk_index"] = (0,) * t.ndim
|
|
59
|
+
with np.errstate(all="ignore"), quiet_stdio():
|
|
60
|
+
mock_result = self.func(
|
|
61
|
+
np.random.rand(2, 2).astype(t.dtype),
|
|
62
|
+
*(self.args or ()),
|
|
63
|
+
**kwargs
|
|
64
|
+
)
|
|
65
|
+
except:
|
|
66
|
+
raise TypeError("Cannot estimate output type of apply_chunk call")
|
|
67
|
+
dtype = mock_result.dtype
|
|
68
|
+
order = (
|
|
69
|
+
TensorOrder.C_ORDER
|
|
70
|
+
if mock_result.flags["C_CONTIGUOUS"]
|
|
71
|
+
else TensorOrder.F_ORDER
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
if shape is not None:
|
|
75
|
+
new_shape = shape
|
|
76
|
+
else:
|
|
77
|
+
new_shape = t.shape if self.elementwise else (np.nan,) * t.ndim
|
|
78
|
+
inputs = (
|
|
79
|
+
[t]
|
|
80
|
+
+ find_objects(self.args, ENTITY_TYPE)
|
|
81
|
+
+ find_objects(self.kwargs, ENTITY_TYPE)
|
|
82
|
+
)
|
|
83
|
+
return self.new_tensor(inputs, dtype=dtype, shape=new_shape, order=order)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def apply_chunk(t, func, args=(), **kwargs):
|
|
87
|
+
"""
|
|
88
|
+
Apply function to each chunk.
|
|
89
|
+
|
|
90
|
+
Parameters
|
|
91
|
+
----------
|
|
92
|
+
func : function
|
|
93
|
+
Function to apply to each chunk.
|
|
94
|
+
args : tuple
|
|
95
|
+
Positional arguments to pass to func in addition to the array.
|
|
96
|
+
**kwargs
|
|
97
|
+
Additional keyword arguments to pass as keywords arguments to func.
|
|
98
|
+
|
|
99
|
+
Returns
|
|
100
|
+
-------
|
|
101
|
+
Tensor
|
|
102
|
+
Result of applying ``func`` to each chunk of the Tensor.
|
|
103
|
+
|
|
104
|
+
Examples
|
|
105
|
+
--------
|
|
106
|
+
>>> import maxframe.tensor as mt
|
|
107
|
+
>>> a = mt.array([[4, 9]] * 3)
|
|
108
|
+
>>> a.execute()
|
|
109
|
+
array([[4, 9],
|
|
110
|
+
[4, 9],
|
|
111
|
+
[4, 9]])
|
|
112
|
+
|
|
113
|
+
Output dtype will be auto inferred.
|
|
114
|
+
|
|
115
|
+
>>> a.mf.apply_chunk(lambda c: c * 0.5).execute()
|
|
116
|
+
array([[2. , 4.5],
|
|
117
|
+
[2. , 4.5],
|
|
118
|
+
[2. , 4.5]])
|
|
119
|
+
|
|
120
|
+
You can specify ``dtype`` by yourself if auto infer failed.
|
|
121
|
+
"""
|
|
122
|
+
elementwise = kwargs.pop("elementwise", None)
|
|
123
|
+
dtype = np.dtype(kwargs.pop("dtype")) if "dtype" in kwargs else None
|
|
124
|
+
shape = kwargs.pop("shape", None)
|
|
125
|
+
order = kwargs.pop("order", None)
|
|
126
|
+
sparse = kwargs.pop("sparse", t.issparse())
|
|
127
|
+
with_chunk_index = kwargs.pop("with_chunk_index", False)
|
|
128
|
+
|
|
129
|
+
op = TensorApplyChunk(
|
|
130
|
+
func=func,
|
|
131
|
+
args=args,
|
|
132
|
+
kwargs=kwargs,
|
|
133
|
+
elementwise=elementwise,
|
|
134
|
+
with_chunk_index=with_chunk_index,
|
|
135
|
+
sparse=sparse,
|
|
136
|
+
)
|
|
137
|
+
return op(t, dtype=dtype, shape=shape, order=order)
|
|
@@ -17,7 +17,7 @@ from .compress import compress
|
|
|
17
17
|
from .extract import extract
|
|
18
18
|
from .fill_diagonal import TensorFillDiagonal, fill_diagonal
|
|
19
19
|
from .flatnonzero import flatnonzero
|
|
20
|
-
from .getitem import
|
|
20
|
+
from .getitem import TensorIndex
|
|
21
21
|
from .nonzero import TensorNonzero, nonzero
|
|
22
22
|
from .setitem import TensorIndexSetValue
|
|
23
23
|
from .slice import TensorSlice
|