maxframe 1.3.1__cp39-cp39-macosx_10_9_universal2.whl → 2.0.0b2__cp39-cp39-macosx_10_9_universal2.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.cpython-39-darwin.so +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.cpython-39-darwin.so +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 +109 -19
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +80 -1
- 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 +10 -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 +21 -58
- maxframe/io/odpsio/volumeio.py +23 -8
- 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 +54 -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.cpython-39-darwin.so +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.cpython-39-darwin.so +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 +59 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/METADATA +4 -1
- maxframe-2.0.0b2.dist-info/RECORD +939 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.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.0b2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
|
|
16
|
+
def ndim(a):
|
|
17
|
+
"""
|
|
18
|
+
Return the number of dimensions of a tensor.
|
|
19
|
+
|
|
20
|
+
Parameters
|
|
21
|
+
----------
|
|
22
|
+
a : array_like
|
|
23
|
+
Input tebsir. If it is not already a tensor, a conversion is
|
|
24
|
+
attempted.
|
|
25
|
+
|
|
26
|
+
Returns
|
|
27
|
+
-------
|
|
28
|
+
number_of_dimensions : int
|
|
29
|
+
The number of dimensions in `a`. Scalars are zero-dimensional.
|
|
30
|
+
|
|
31
|
+
See Also
|
|
32
|
+
--------
|
|
33
|
+
ndarray.ndim : equivalent method
|
|
34
|
+
shape : dimensions of tensor
|
|
35
|
+
Tensor.shape : dimensions of tensor
|
|
36
|
+
|
|
37
|
+
Examples
|
|
38
|
+
--------
|
|
39
|
+
>>> import maxframe.tensor as mt
|
|
40
|
+
>>> mt.ndim([[1,2,3],[4,5,6]])
|
|
41
|
+
2
|
|
42
|
+
>>> mt.ndim(mt.array([[1,2,3],[4,5,6]]))
|
|
43
|
+
2
|
|
44
|
+
>>> mt.ndim(1)
|
|
45
|
+
0
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
from ..datasource import asarray
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
return a.ndim
|
|
52
|
+
except AttributeError:
|
|
53
|
+
return asarray(a).ndim
|
maxframe/tensor/misc/ravel.py
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
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 numbers import Integral
|
|
16
|
+
from typing import List
|
|
17
|
+
|
|
18
|
+
import numpy as np
|
|
19
|
+
|
|
20
|
+
from ... import opcodes
|
|
21
|
+
from ...serialization.serializables import AnyField, Int32Field
|
|
22
|
+
from ...typing_ import EntityType
|
|
23
|
+
from ..core import Tensor, TensorOrder
|
|
24
|
+
from ..datasource import tensor as astensor
|
|
25
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
26
|
+
from ..utils import broadcast_shape
|
|
27
|
+
from .ravel import ravel
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class TensorRepeat(TensorHasInput, TensorOperatorMixin):
|
|
31
|
+
_op_type_ = opcodes.REPEAT
|
|
32
|
+
|
|
33
|
+
repeats = AnyField("repeats", default=None)
|
|
34
|
+
axis = Int32Field("axis", default=None)
|
|
35
|
+
|
|
36
|
+
def __init__(self, sparse=False, **kw):
|
|
37
|
+
super().__init__(sparse=sparse, **kw)
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def _set_inputs(cls, op: "TensorRepeat", inputs: List[EntityType]):
|
|
41
|
+
super()._set_inputs(op, inputs)
|
|
42
|
+
if len(inputs) > 1:
|
|
43
|
+
op.repeats = inputs[1]
|
|
44
|
+
|
|
45
|
+
def __call__(self, a, repeats):
|
|
46
|
+
axis = self.axis
|
|
47
|
+
a = astensor(a)
|
|
48
|
+
if axis is None:
|
|
49
|
+
a = ravel(a)
|
|
50
|
+
|
|
51
|
+
ax = axis or 0
|
|
52
|
+
|
|
53
|
+
if not isinstance(repeats, Integral):
|
|
54
|
+
if not isinstance(repeats, Tensor):
|
|
55
|
+
repeats = np.asarray(repeats)
|
|
56
|
+
if repeats.size == 1:
|
|
57
|
+
repeats = int(repeats[0])
|
|
58
|
+
size = repeats * a.shape[axis or 0]
|
|
59
|
+
elif a.shape[ax] == 1:
|
|
60
|
+
size = repeats = int(repeats.sum())
|
|
61
|
+
else:
|
|
62
|
+
size = int(repeats.sum())
|
|
63
|
+
else:
|
|
64
|
+
size = np.nan
|
|
65
|
+
if not isinstance(repeats, Integral):
|
|
66
|
+
if repeats.ndim != 1:
|
|
67
|
+
raise ValueError("repeats should be 1-d tensor")
|
|
68
|
+
broadcast_shape(repeats.shape, a.shape[ax : ax + 1])
|
|
69
|
+
else:
|
|
70
|
+
size = a.shape[axis or 0] * repeats
|
|
71
|
+
|
|
72
|
+
shape = a.shape[:ax] + (size,) + a.shape[ax + 1 :]
|
|
73
|
+
self.dtype = a.dtype
|
|
74
|
+
self.sparse = a.issparse()
|
|
75
|
+
|
|
76
|
+
inputs = [a]
|
|
77
|
+
if isinstance(repeats, Tensor):
|
|
78
|
+
inputs.append(repeats)
|
|
79
|
+
else:
|
|
80
|
+
self.repeats = repeats
|
|
81
|
+
|
|
82
|
+
return self.new_tensor(inputs, shape, order=TensorOrder.C_ORDER)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def repeat(a, repeats, axis=None):
|
|
86
|
+
"""
|
|
87
|
+
Repeat elements of a tensor.
|
|
88
|
+
|
|
89
|
+
Parameters
|
|
90
|
+
----------
|
|
91
|
+
a : array_like
|
|
92
|
+
Input tensor.
|
|
93
|
+
repeats : int or tensor of ints
|
|
94
|
+
The number of repetitions for each element. `repeats` is broadcasted
|
|
95
|
+
to fit the shape of the given axis.
|
|
96
|
+
axis : int, optional
|
|
97
|
+
The axis along which to repeat values. By default, use the
|
|
98
|
+
flattened input tensor, and return a flat output tensor.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
repeated_tensor : Tensor
|
|
103
|
+
Output array which has the same shape as `a`, except along
|
|
104
|
+
the given axis.
|
|
105
|
+
|
|
106
|
+
See Also
|
|
107
|
+
--------
|
|
108
|
+
tile : Tile a tensor.
|
|
109
|
+
|
|
110
|
+
Examples
|
|
111
|
+
--------
|
|
112
|
+
>>> import maxframe.tensor as mt
|
|
113
|
+
|
|
114
|
+
>>> mt.repeat(3, 4).execute()
|
|
115
|
+
array([3, 3, 3, 3])
|
|
116
|
+
>>> x = mt.array([[1,2],[3,4]])
|
|
117
|
+
>>> mt.repeat(x, 2).execute()
|
|
118
|
+
array([1, 1, 2, 2, 3, 3, 4, 4])
|
|
119
|
+
>>> mt.repeat(x, 3, axis=1).execute()
|
|
120
|
+
array([[1, 1, 1, 2, 2, 2],
|
|
121
|
+
[3, 3, 3, 4, 4, 4]])
|
|
122
|
+
>>> mt.repeat(x, [1, 2], axis=0).execute()
|
|
123
|
+
array([[1, 2],
|
|
124
|
+
[3, 4],
|
|
125
|
+
[3, 4]])
|
|
126
|
+
|
|
127
|
+
"""
|
|
128
|
+
op = TensorRepeat(axis=axis)
|
|
129
|
+
return op(a, repeats)
|
|
@@ -0,0 +1,147 @@
|
|
|
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 List
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ...core import TILEABLE_TYPE, EntityData
|
|
21
|
+
from ...serialization.serializables import AnyField, Int32Field, Int64Field, StringField
|
|
22
|
+
from ..core import TENSOR_TYPE, TensorOrder
|
|
23
|
+
from ..datasource.array import tensor as astensor
|
|
24
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TensorSearchsorted(TensorOperator, TensorOperatorMixin):
|
|
28
|
+
_op_type_ = opcodes.SEARCHSORTED
|
|
29
|
+
|
|
30
|
+
a = AnyField("a")
|
|
31
|
+
v = AnyField("v")
|
|
32
|
+
side = StringField("side")
|
|
33
|
+
combine_size = Int32Field("combine_size")
|
|
34
|
+
# for chunk
|
|
35
|
+
offset = Int64Field("offset")
|
|
36
|
+
size = Int64Field("size")
|
|
37
|
+
n_chunk = Int64Field("n_chunk")
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def _set_inputs(cls, op: "TensorSearchsorted", inputs: List[EntityData]):
|
|
41
|
+
super()._set_inputs(op, inputs)
|
|
42
|
+
op.a = inputs[0]
|
|
43
|
+
if isinstance(op.v, TILEABLE_TYPE):
|
|
44
|
+
op.v = op._inputs[1]
|
|
45
|
+
|
|
46
|
+
def __call__(self, a, v):
|
|
47
|
+
inputs = [a]
|
|
48
|
+
if isinstance(v, TILEABLE_TYPE):
|
|
49
|
+
inputs.append(v)
|
|
50
|
+
shape = v.shape
|
|
51
|
+
else:
|
|
52
|
+
shape = ()
|
|
53
|
+
return self.new_tensor(inputs, shape=shape, order=TensorOrder.C_ORDER)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def searchsorted(a, v, side="left", sorter=None, combine_size=None):
|
|
57
|
+
"""
|
|
58
|
+
Find indices where elements should be inserted to maintain order.
|
|
59
|
+
|
|
60
|
+
Find the indices into a sorted tensor `a` such that, if the
|
|
61
|
+
corresponding elements in `v` were inserted before the indices, the
|
|
62
|
+
order of `a` would be preserved.
|
|
63
|
+
|
|
64
|
+
Assuming that `a` is sorted:
|
|
65
|
+
|
|
66
|
+
====== ============================
|
|
67
|
+
`side` returned index `i` satisfies
|
|
68
|
+
====== ============================
|
|
69
|
+
left ``a[i-1] < v <= a[i]``
|
|
70
|
+
right ``a[i-1] <= v < a[i]``
|
|
71
|
+
====== ============================
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
a : 1-D array_like
|
|
76
|
+
Input tensor. If `sorter` is None, then it must be sorted in
|
|
77
|
+
ascending order, otherwise `sorter` must be an array of indices
|
|
78
|
+
that sort it.
|
|
79
|
+
v : array_like
|
|
80
|
+
Values to insert into `a`.
|
|
81
|
+
side : {'left', 'right'}, optional
|
|
82
|
+
If 'left', the index of the first suitable location found is given.
|
|
83
|
+
If 'right', return the last such index. If there is no suitable
|
|
84
|
+
index, return either 0 or N (where N is the length of `a`).
|
|
85
|
+
sorter : 1-D array_like, optional
|
|
86
|
+
Optional tensor of integer indices that sort array a into ascending
|
|
87
|
+
order. They are typically the result of argsort.
|
|
88
|
+
combine_size: int, optional
|
|
89
|
+
The number of chunks to combine.
|
|
90
|
+
|
|
91
|
+
Returns
|
|
92
|
+
-------
|
|
93
|
+
indices : tensor of ints
|
|
94
|
+
Array of insertion points with the same shape as `v`.
|
|
95
|
+
|
|
96
|
+
See Also
|
|
97
|
+
--------
|
|
98
|
+
sort : Return a sorted copy of a tensor.
|
|
99
|
+
histogram : Produce histogram from 1-D data.
|
|
100
|
+
|
|
101
|
+
Notes
|
|
102
|
+
-----
|
|
103
|
+
Binary search is used to find the required insertion points.
|
|
104
|
+
|
|
105
|
+
This function is a faster version of the builtin python `bisect.bisect_left`
|
|
106
|
+
(``side='left'``) and `bisect.bisect_right` (``side='right'``) functions,
|
|
107
|
+
which is also vectorized in the `v` argument.
|
|
108
|
+
|
|
109
|
+
Examples
|
|
110
|
+
--------
|
|
111
|
+
>>> import maxframe.tensor as mt
|
|
112
|
+
|
|
113
|
+
>>> mt.searchsorted([1,2,3,4,5], 3).execute()
|
|
114
|
+
2
|
|
115
|
+
>>> mt.searchsorted([1,2,3,4,5], 3, side='right').execute()
|
|
116
|
+
3
|
|
117
|
+
>>> mt.searchsorted([1,2,3,4,5], [-10, 10, 2, 3]).execute()
|
|
118
|
+
array([0, 5, 1, 2])
|
|
119
|
+
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
if (
|
|
123
|
+
not isinstance(a, TENSOR_TYPE)
|
|
124
|
+
and sorter is not None
|
|
125
|
+
and not isinstance(sorter, TENSOR_TYPE)
|
|
126
|
+
):
|
|
127
|
+
a = astensor(np.asarray(a)[sorter])
|
|
128
|
+
else:
|
|
129
|
+
a = astensor(a)
|
|
130
|
+
if sorter is not None:
|
|
131
|
+
a = a[sorter]
|
|
132
|
+
|
|
133
|
+
if a.ndim != 1:
|
|
134
|
+
raise ValueError("`a` should be 1-d tensor")
|
|
135
|
+
if a.issparse():
|
|
136
|
+
# does not support sparse tensor
|
|
137
|
+
raise ValueError("`a` should be a dense tensor")
|
|
138
|
+
if side not in {"left", "right"}:
|
|
139
|
+
raise ValueError(f"'{side}' is an invalid value for keyword 'side'")
|
|
140
|
+
|
|
141
|
+
if not np.isscalar(v):
|
|
142
|
+
v = astensor(v)
|
|
143
|
+
|
|
144
|
+
op = TensorSearchsorted(
|
|
145
|
+
v=v, side=side, dtype=np.dtype(np.intp), combine_size=combine_size
|
|
146
|
+
)
|
|
147
|
+
return op(a, v)
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
|
|
16
|
+
def setdiff1d(ar1, ar2, assume_unique=False):
|
|
17
|
+
"""
|
|
18
|
+
Find the set difference of two tensors.
|
|
19
|
+
|
|
20
|
+
Return the unique values in `ar1` that are not in `ar2`.
|
|
21
|
+
|
|
22
|
+
Parameters
|
|
23
|
+
----------
|
|
24
|
+
ar1 : array_like
|
|
25
|
+
Input tensor.
|
|
26
|
+
ar2 : array_like
|
|
27
|
+
Input comparison tensor.
|
|
28
|
+
assume_unique : bool
|
|
29
|
+
If True, the input tensors are both assumed to be unique, which
|
|
30
|
+
can speed up the calculation. Default is False.
|
|
31
|
+
|
|
32
|
+
Returns
|
|
33
|
+
-------
|
|
34
|
+
setdiff1d : Tensor
|
|
35
|
+
1D tensor of values in `ar1` that are not in `ar2`. The result
|
|
36
|
+
is sorted when `assume_unique=False`, but otherwise only sorted
|
|
37
|
+
if the input is sorted.
|
|
38
|
+
|
|
39
|
+
Examples
|
|
40
|
+
--------
|
|
41
|
+
>>> import maxframe.tensor as mt
|
|
42
|
+
>>> a = mt.array([1, 2, 3, 2, 4, 1])
|
|
43
|
+
>>> b = mt.array([3, 4, 5, 6])
|
|
44
|
+
>>> mt.setdiff1d(a, b).execute()
|
|
45
|
+
array([1, 2])
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
|
|
49
|
+
from ..datasource.array import asarray
|
|
50
|
+
from .in1d import in1d
|
|
51
|
+
from .unique import unique
|
|
52
|
+
|
|
53
|
+
if assume_unique:
|
|
54
|
+
ar1 = asarray(ar1).ravel()
|
|
55
|
+
else:
|
|
56
|
+
ar1 = unique(ar1)
|
|
57
|
+
ar2 = unique(ar2)
|
|
58
|
+
return ar1[in1d(ar1, ar2, assume_unique=True, invert=True)]
|
|
@@ -0,0 +1,117 @@
|
|
|
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 collections.abc import Iterable
|
|
16
|
+
|
|
17
|
+
from ... import opcodes
|
|
18
|
+
from ...serialization.serializables import FieldTypes, TupleField
|
|
19
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class TensorSqueeze(TensorHasInput, TensorOperatorMixin):
|
|
23
|
+
_op_type_ = opcodes.SQUEEZE
|
|
24
|
+
|
|
25
|
+
axis = TupleField("axis", FieldTypes.int32)
|
|
26
|
+
|
|
27
|
+
def on_output_modify(self, new_output):
|
|
28
|
+
slcs = [slice(None)] * new_output.ndim
|
|
29
|
+
for axis in self.axis:
|
|
30
|
+
slcs.insert(axis, None)
|
|
31
|
+
return new_output[slcs]
|
|
32
|
+
|
|
33
|
+
def on_input_modify(self, new_input):
|
|
34
|
+
op = self.copy().reset_key()
|
|
35
|
+
return op(new_input, self.outputs[0].shape)
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def _get_squeeze_shape(shape, axis):
|
|
39
|
+
if axis is not None:
|
|
40
|
+
if isinstance(axis, Iterable):
|
|
41
|
+
axis = tuple(axis)
|
|
42
|
+
else:
|
|
43
|
+
axis = (axis,)
|
|
44
|
+
|
|
45
|
+
for ax in axis:
|
|
46
|
+
if shape[ax] != 1:
|
|
47
|
+
raise ValueError(
|
|
48
|
+
"cannot select an axis to squeeze out "
|
|
49
|
+
"which has size not equal to one"
|
|
50
|
+
)
|
|
51
|
+
shape = tuple(s for i, s in enumerate(shape) if i not in axis)
|
|
52
|
+
else:
|
|
53
|
+
axis = tuple(i for i, s in enumerate(shape) if s == 1)
|
|
54
|
+
shape = tuple(s for s in shape if s != 1)
|
|
55
|
+
|
|
56
|
+
return shape, axis
|
|
57
|
+
|
|
58
|
+
def __call__(self, a, shape):
|
|
59
|
+
return self.new_tensor([a], shape, order=a.order)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def squeeze(a, axis=None):
|
|
63
|
+
"""
|
|
64
|
+
Remove single-dimensional entries from the shape of a tensor.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
a : array_like
|
|
69
|
+
Input data.
|
|
70
|
+
axis : None or int or tuple of ints, optional
|
|
71
|
+
Selects a subset of the single-dimensional entries in the
|
|
72
|
+
shape. If an axis is selected with shape entry greater than
|
|
73
|
+
one, an error is raised.
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
squeezed : Tensor
|
|
78
|
+
The input tensor, but with all or a subset of the
|
|
79
|
+
dimensions of length 1 removed. This is always `a` itself
|
|
80
|
+
or a view into `a`.
|
|
81
|
+
|
|
82
|
+
Raises
|
|
83
|
+
------
|
|
84
|
+
ValueError
|
|
85
|
+
If `axis` is not `None`, and an axis being squeezed is not of length 1
|
|
86
|
+
|
|
87
|
+
See Also
|
|
88
|
+
--------
|
|
89
|
+
expand_dims : The inverse operation, adding singleton dimensions
|
|
90
|
+
reshape : Insert, remove, and combine dimensions, and resize existing ones
|
|
91
|
+
|
|
92
|
+
Examples
|
|
93
|
+
--------
|
|
94
|
+
>>> import maxframe.tensor as mt
|
|
95
|
+
|
|
96
|
+
>>> x = mt.array([[[0], [1], [2]]])
|
|
97
|
+
>>> x.shape
|
|
98
|
+
(1, 3, 1)
|
|
99
|
+
>>> mt.squeeze(x).shape
|
|
100
|
+
(3,)
|
|
101
|
+
>>> mt.squeeze(x, axis=0).shape
|
|
102
|
+
(3, 1)
|
|
103
|
+
>>> mt.squeeze(x, axis=1).shape
|
|
104
|
+
Traceback (most recent call last):
|
|
105
|
+
...
|
|
106
|
+
ValueError: cannot select an axis to squeeze out which has size not equal to one
|
|
107
|
+
>>> mt.squeeze(x, axis=2).shape
|
|
108
|
+
(1, 3)
|
|
109
|
+
|
|
110
|
+
"""
|
|
111
|
+
shape, axis = TensorSqueeze._get_squeeze_shape(a.shape, axis)
|
|
112
|
+
|
|
113
|
+
if 1 not in a.shape:
|
|
114
|
+
return a
|
|
115
|
+
|
|
116
|
+
op = TensorSqueeze(axis=axis, dtype=a.dtype, sparse=a.issparse())
|
|
117
|
+
return op(a, shape)
|
|
@@ -0,0 +1,113 @@
|
|
|
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 ..datasource import tensor as astensor
|
|
19
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
20
|
+
from ..utils import reverse_order, validate_axis
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TensorSwapAxes(TensorHasInput, TensorOperatorMixin):
|
|
24
|
+
_op_type_ = opcodes.SWAPAXES
|
|
25
|
+
|
|
26
|
+
axis1 = Int32Field("axis1")
|
|
27
|
+
axis2 = Int32Field("axis2")
|
|
28
|
+
|
|
29
|
+
def __init__(self, **kw):
|
|
30
|
+
super().__init__(create_view=True, **kw)
|
|
31
|
+
|
|
32
|
+
def __call__(self, a):
|
|
33
|
+
axis1, axis2 = self.axis1, self.axis2
|
|
34
|
+
if (axis1 == 0 and axis2 == a.ndim - 1) or (axis1 == a.ndim - 1 and axis2 == 0):
|
|
35
|
+
tensor_order = reverse_order(a.order)
|
|
36
|
+
else:
|
|
37
|
+
tensor_order = TensorOrder.C_ORDER
|
|
38
|
+
shape = self._swap(a.shape, self.axis1, self.axis2)
|
|
39
|
+
return self.new_tensor([a], shape, order=tensor_order)
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _swap(it, axis1, axis2):
|
|
43
|
+
new_it = list(it)
|
|
44
|
+
new_it[axis1], new_it[axis2] = it[axis2], it[axis1]
|
|
45
|
+
|
|
46
|
+
return tuple(new_it)
|
|
47
|
+
|
|
48
|
+
def on_output_modify(self, new_output):
|
|
49
|
+
op = TensorSwapAxes(
|
|
50
|
+
axis1=self.axis2,
|
|
51
|
+
axis2=self.axis1,
|
|
52
|
+
dtype=new_output.dtype,
|
|
53
|
+
sparse=new_output.issparse(),
|
|
54
|
+
)
|
|
55
|
+
return op(new_output)
|
|
56
|
+
|
|
57
|
+
def on_input_modify(self, new_input):
|
|
58
|
+
op = self.copy().reset_key()
|
|
59
|
+
return op(new_input)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def swapaxes(a, axis1, axis2):
|
|
63
|
+
"""
|
|
64
|
+
Interchange two axes of a tensor.
|
|
65
|
+
|
|
66
|
+
Parameters
|
|
67
|
+
----------
|
|
68
|
+
a : array_like
|
|
69
|
+
Input tensor.
|
|
70
|
+
axis1 : int
|
|
71
|
+
First axis.
|
|
72
|
+
axis2 : int
|
|
73
|
+
Second axis.
|
|
74
|
+
|
|
75
|
+
Returns
|
|
76
|
+
-------
|
|
77
|
+
a_swapped : Tensor
|
|
78
|
+
If `a` is a Tensor, then a view of `a` is
|
|
79
|
+
returned; otherwise a new tensor is created.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
--------
|
|
83
|
+
>>> import maxframe.tensor as mt
|
|
84
|
+
|
|
85
|
+
>>> x = mt.array([[1,2,3]])
|
|
86
|
+
>>> mt.swapaxes(x,0,1).execute()
|
|
87
|
+
array([[1],
|
|
88
|
+
[2],
|
|
89
|
+
[3]])
|
|
90
|
+
|
|
91
|
+
>>> x = mt.array([[[0,1],[2,3]],[[4,5],[6,7]]])
|
|
92
|
+
>>> x.execute()
|
|
93
|
+
array([[[0, 1],
|
|
94
|
+
[2, 3]],
|
|
95
|
+
[[4, 5],
|
|
96
|
+
[6, 7]]])
|
|
97
|
+
|
|
98
|
+
>>> mt.swapaxes(x,0,2).execute()
|
|
99
|
+
array([[[0, 4],
|
|
100
|
+
[2, 6]],
|
|
101
|
+
[[1, 5],
|
|
102
|
+
[3, 7]]])
|
|
103
|
+
|
|
104
|
+
"""
|
|
105
|
+
a = astensor(a)
|
|
106
|
+
axis1 = validate_axis(a.ndim, axis1)
|
|
107
|
+
axis2 = validate_axis(a.ndim, axis2)
|
|
108
|
+
|
|
109
|
+
if axis1 == axis2:
|
|
110
|
+
return a
|
|
111
|
+
|
|
112
|
+
op = TensorSwapAxes(axis1=axis1, axis2=axis2, dtype=a.dtype, sparse=a.issparse())
|
|
113
|
+
return op(a)
|
|
@@ -12,9 +12,12 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from typing import List
|
|
16
|
+
|
|
15
17
|
import numpy as np
|
|
16
18
|
|
|
17
19
|
from ... import opcodes
|
|
20
|
+
from ...core import EntityData
|
|
18
21
|
from ...serialization.serializables import FieldTypes, KeyField, ListField
|
|
19
22
|
from ..core import TensorOrder
|
|
20
23
|
from ..datasource import tensor as astensor
|
|
@@ -49,9 +52,10 @@ class TensorTranspose(TensorHasInput, TensorOperatorMixin):
|
|
|
49
52
|
tensor_order = TensorOrder.C_ORDER
|
|
50
53
|
return self.new_tensor([a], shape, order=tensor_order)
|
|
51
54
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
+
@classmethod
|
|
56
|
+
def _set_inputs(cls, op: "TensorTranspose", inputs: List[EntityData]):
|
|
57
|
+
super()._set_inputs(op, inputs)
|
|
58
|
+
op._input = op._inputs[0]
|
|
55
59
|
|
|
56
60
|
def on_output_modify(self, new_output):
|
|
57
61
|
op = self.copy().reset_key()
|
|
@@ -125,5 +129,5 @@ def transpose(a, axes=None):
|
|
|
125
129
|
axes = list(range(a.ndim))[::-1]
|
|
126
130
|
else:
|
|
127
131
|
axes = list(axes)
|
|
128
|
-
op = TensorTranspose(axes, dtype=a.dtype)
|
|
132
|
+
op = TensorTranspose(axes, dtype=a.dtype, sparse=a.issparse())
|
|
129
133
|
return op(a)
|